//定义layer structlayer { LAYER_TYPE type; // 网络层的类型,枚举类型,取值比如DROPOUT,CONVOLUTIONAL,MAXPOOL分别表示dropout层,卷积层,最大池化层,可参见LAYER_TYPE枚举类型的定义 ACTIVATION activation; //激活函数类型,枚举类型 COST_TYPE cost_type; //损失函数类型,枚举类型 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); layer *share_layer; int train; int avgpool; int batch_normalize; // 是否进行BN,如果进行BN,则值为1 int shortcut; int batch; // 一个batch中含有的图片张数,等于net.batch,详细可以参考network.h中的注释,一般在构建具体网络层时赋值(比如make_maxpool_layer()中) int forced; int flipped; int inputs; // 一张输入图片所含的元素个数(一般在各网络层构建函数中赋值,比如make_connected_layer()),第一层的值等于l.h*l.w*l.c, // 之后的每一层都是由上一层的输出自动推算得到的(参见parse_network_cfg(),在构建每一层后,会更新params.inputs为上一层的l.outputs) int outputs; // 该层对应一张输入图片的输出元素个数(一般在各网络层构建函数中赋值,比如make_connected_layer()) // 对于一些网络,可由输入图片的尺寸及相关参数计算出,比如卷积层,可以通过输入尺寸以及步长、核大小计算出; // 对于另一些尺寸,则需要通过网络配置文件指定,如未指定,取默认值1,比如全连接层(见parse_connected()函数) int nweights; int nbiases; int extra; int truths; // < 根据region_layer.c判断,这个变量表示一张图片含有的真实值的个数,对于检测模型来说,一个真实的标签含有5个值, // 包括类型对应的编号以及定位矩形框用到的w,h,x,y四个参数,且在darknet中固定每张图片最大处理30个矩形框,(可查看max_boxes参数), // 因此,在region_layer.c的make_region_layer()函数中赋值为30*5. int h, w, c; // 该层输入的图片的宽,高,通道数(一般在各网络层构建函数中赋值,比如make_connected_layer()) int out_h, out_w, out_c;// 该层输出图片的高、宽、通道数(一般在各网络层构建函数中赋值,比如make_connected_layer()) int n; // 对于卷积层,该参数表示卷积核个数,等于out_c,其值由网络配置文件指定;对于region_layer层,该参数等于配置文件中的num值 // (该参数通过make_region_layer()函数赋值,在parser.c中调用的make_region_layer()函数), // 可以在darknet/cfg文件夹下执行命令:grep num *.cfg便可以搜索出所有设置了num参数的网络,这里面包括yolo.cfg等,其值有 // 设定为3,5,2的,该参数就是Yolo论文中的B,也就是一个cell中预测多少个box。 int max_boxes; // 每张图片最多含有的标签矩形框数(参看:data.c中的load_data_detection(),其输入参数boxes就是指这个参数), // 什么意思呢?就是每张图片中最多打了max_boxes个标签物体,模型预测过程中,可能会预测出很多的物体,但实际上, // 图片中打上标签的真正存在的物体最多就max_boxes个,预测多出来的肯定存在false positive,需要滤出与筛选, // 可参看region_layer.c中forward_region_layer()函数的第二个for循环中的注释 int groups; // 应该是控制组卷积的组数,类似于caffe的group参数 int group_id; int size; // 核尺寸(比如卷积核,池化核等) int side; int stride; // 滑动步长,如卷积核的滑动步长 int stride_x; int stride_y; int dilation; //空洞卷积参数 int antialiasing; int maxpool_depth; int out_channels; // 输出通道数 int reverse; int flatten; int spatial; int pad; // 该层对输入数据四周的补0长度(现在发现在卷积层,最大池化层中有用到该参数),一般在构建具体网络层时赋值(比如make_maxpool_layer()中) int sqrt; int flip; int index; int scale_wh; int binary; int xnor; int peephole; int use_bin_output; int keep_delta_gpu; int optimized_memory; int steps; int state_constrain; int hidden; int truth; float smooth; float dot; int deform; int sway; int rotate; int stretch; int stretch_sway; float angle; float jitter; float saturation; float exposure; float shift; float ratio; float learning_rate_scale; float clip; int focal_loss; float *classes_multipliers; float label_smooth_eps; int noloss; int softmax; int classes; // 物体类别种数,一个训练好的网络,只能检测指定所有物体类别中的物体,比如yolo9000.cfg,设置该值为9418, // 也就是该网络训练好了之后可以检测9418种物体。该参数由网络配置文件指定。目前在作者给的例子中, // 有设置该值的配置文件大都是检测模型,纯识别的网络模型没有设置该值,我想是因为检测模型输出的一般会为各个类别的概率, // 所以需要知道这个种类数目,而识别的话,不需要知道某个物体属于这些所有类的具体概率,因此可以不知道。 int coords; // 这个参数一般用在检测模型中,且不是所有层都有这个参数,一般在检测模型最后一层有,比如region_layer层,该参数的含义 // 是定位一个物体所需的参数个数,一般为4个,包括物体所在矩形框中心坐标x,y两个参数以及矩形框长宽w,h两个参数, // 可以在darknet/cfg文件夹下,执行grep coords *.cfg,会搜索出所有使用该参数的模型,并可看到该值都设置为4 int background; int rescore; int objectness; int does_cost; int joint; int noadjust; int reorg; int log; int tanh; int *mask; int total; float bflops;
int adam; float B1; float B2; float eps;
int t;
float alpha; float beta; float kappa;
float coord_scale; float object_scale; float noobject_scale; float mask_scale; float class_scale; int bias_match; float random; float ignore_thresh; float truth_thresh; float iou_thresh; float thresh; float focus; int classfix; int absolute; int assisted_excitation;
int onlyforward; // 标志参数,当值为1那么当前层只执行前向传播 int stopbackward; // 标志参数,用来强制停止反向传播过程(值为1则停止反向传播),参看network.c中的backward_network()函数 int dontload; int dontsave; int dontloadscales; int numload;