目录
这里对darknet使用到的结构体进行汇总。
- // cfg文件每一个[xxx]代表一个片区(section),通常表示的是一个 层(layer)
- // 链表中的每个node,都是一个section.
- // 双向链表的节点定义
- typedef struct node{
- void *val; // 存放的是指向实际值的指针。
- struct node *next; // 指向当前节点的下一节点
- struct node *prev; // 指向当前节点的上一节点
- } node;

- // 网络配置双向链表,存储cfg网络配置文件。
- // // 双向链表
- typedef struct list{
- int size; // 配置文件的节点数,即section个数,通常就是layer层数
- node *front; // 头指针,指针链表第一个节点
- node *back; // 尾指针,指针链表最后一个节点
- } list;
- typedef struct{
- char *type; // 字符串
- list *options; // 双向链表
- }section;
一个section结构体变量,对应一个网络层配置。
(1) type可能的值:[net], [maxpool], [convolutional], [avgpool], [softmax]等等;
(2) options:双向链表,利用尾插法,逐个插入中括号后面的属性;
例如。*.cfg配置文件内容如下。
- [net]
- batch=128
- subdivisions=1
- height=28
- width=28
- channels=3
- max_crop=32
- min_crop=32
-
- hue=.1
- saturation=.75
- exposure=.75
-
- learning_rate=0.1
- policy=poly
- power=4
- max_batches = 5000
- momentum=0.9
- decay=0.0005
-
- [convolutional]
- batch_normalize=1
- filters=32
- size=3
- stride=1
- pad=1
- activation=leaky
-
- [maxpool]
- size=2
- stride=2
-
- [convolutional]
- batch_normalize=1
- filters=16
- size=1
- stride=1
- pad=1
- activation=leaky
则对应得到的,双向链表存储内容如下,网状结构。

- typedef struct size_params{
- int batch;
- int inputs; // h*w*c
- int h;
- int w;
- int c;
- int index;
- int time_steps;
- int train; // 为0,则Inference only,为1,Inference & Training
- network net;
- } size_params;
kvp结构体变量存储的是键值对,比如网络层convolutional有属性batch_normlize=1, filters=2.
- ///
- /// 存放属性,比如filter=3.
- ///
- typedef struct{
- char *key; // filter
- char *val; // 3
- int used; // 0代表未被使用
- } kvp;
net网络
- typedef struct network {
- int n; // 网络中层的数量
- int batch; // 批次大小
- uint64_t *seen; // 已经有多少图片被处理过了
- float epoch; // 迭代大小
- int subdivisions; // 子划分,对batch size进行进一步的划分,以便于某些小显存的GPU也能够运行程序。
- layer *layers; // 每一个层的定义,layer结构体指针。
- float *output; // 输出
- learning_rate_policy policy; // 学习率更新策略,枚举类型,包括CONSTANT, STEP, EXP, POLY, STEPS, SIG, RANDOM, SGDR
- float learning_rate; // 学习率
- float learning_rate_min;
- float learning_rate_max;
- int batches_per_cycle;
- int batches_cycle_mult;
- float momentum; // 动量大小
- float decay; // 衰减系数
- ...
- } network;
layer网络层
- // layer.h
- struct layer {
- LAYER_TYPE type; // 网络层的名称,枚举类型,比如CONVOLUTIONAL、 MAXPOOL
- ACTIVATION activation; // 激活函数名称,枚举类型,比如RELU, RELU6, RELIE, LINEAR
- ACTIVATION lstm_activation; // 激活函数名称,枚举类型
- COST_TYPE cost_type; // 损失函数名称,枚举类型,包含SSE, MASKED, L1, SEG, SMOOTH,WGAN
- // 定义函数指针
- void(*forward) (struct layer, struct network_state); // 前向传播
- void(*backward) (struct layer, struct network_state); // 反向传播
- void(*update) (struct layer, int, float, float, float); // 更新函数
- void(*forward_gpu) (struct layer, struct network_state);
- void(*backward_gpu) (struct layer, struct network_state);
- void(*update_gpu) (struct layer, int, float, float, float, float);
- layer *share_layer; // 结构体指针,指向layer结构体变量
- int train; // 标志符,1表示训练。
- int avgpool; // 标志符, ?
- int batch_normalize; // 标志符, ?
- int shortcut; // 标志符, ?
- int batch; // batch size
- int dynamic_minibatch; // ?
- int forced;
- int flipped;
- int inputs; // 输入图片(特征)的元素个数?
- int outputs; // 输入图片(特征)的元素个数?
- float mean_alpha;
- int nweights; // 权值矩阵元素个数,即n个多通道卷积核的所有元素个数
- int nbiases; // 偏置项元素个数,对于卷积层,偏置项个数==卷积核个数,对于全连接层,偏置项个数==神经元个数
- int extra;
- int truths;
- int h, w, c; // 特征图的尺度。
- int out_h, out_w, out_c; // 输出特征图的尺度
- int n; // 卷积核个数
- int max_boxes;
- int truth_size;
- int groups; // 组数,默认是1,分组卷积技术。
- int group_id;
- int size; // 卷积核的长宽,默认长宽相等。
- int side;
- int stride; // 步长
- int stride_x; // x方向的步长
- int stride_y;
- int dilation; // 空洞卷积参数,默认是1
- ...
- };
待续。。。