Darknet--layer结构体相关参数[cpu版]
layer结构体-针对卷积池化全连接dropout层和cost层
struct layer{
LAYER_TYPE type; //网络层的类型名称,LAYER_TYPE是枚举类型
ACTIVATION activation; //激活函数类型,枚举类型
COST_TYPE cost_type; //损失函数类型,枚举类型,仅在使用cost层时使用
/*前向传播、后向传播、更新函数在此结构体定义时,均定义为函数指针
函数指针,其本质是一个指针变量,该指针指向这个函数。总结来说,函数指针就是指向函数的指针。
*/
void(*forward) (struct layer, struct network_state);
void(*backward) (struct layer, struct network_state);
void(*update) (struct layer, int, float,float, float);
int train;//train阶段的标识符,如果进行训练,则值为1
int batch; // 一个batch中含有的图片张数,等于net.batch,其实是cfg中的batch/subdivisions
int steps;//迭代数
int index;//当前层所在网络中的层数
/*
该层输入相关参数,其中:
*w :输入的图片(或特征图)的宽
*h :输入的图片(或特征图)的高
*c :输入的图片(或特征图)的通道数
*inputs :输入的图片(或特征图)的元素个数
*/
int w, h, c;
int inputs;
/*
卷积核相关参数,其中:
*n :卷积核个数
*groups :组数(与分组卷积有关,普通卷积的组数为1)
*index :分组卷积时的组索引
*size :卷积核的长和宽,这里默认卷积核的长宽一样
*stride_x :x方向的步长
*stride_y :y方向的步长
*dilation :空洞卷积空洞率,通常卷积运算都有该参数,普通卷积时为1
*pad :补零的行数或列数,仅对一条边而言
*nweights :权值矩阵元素个数(n个多通道卷积核的所有元素个数)
*weights :权值矩阵(权值矩阵会被压成一个行向量,这里是权值矩阵的首地址,即整个权值矩阵)
*nbiases :偏置项元素个数,对于卷积层,偏置项个数==卷积核个数,对于全连接层,偏置项个数==神经元个数
*biases :偏置项矩阵(同样会被压成一个行向量)
*/
int n, groups, size, stride_x, stride_y, dilation, pad;
int nweights;
float *weights;
int nbiases;
float *biases;
/*
该层输出相关参数,其中:
*out_h :输出的图片(或特征图)的宽
*out_w :输出的图片(或特征图)的高
*out_c :输出的图片(或特征图)的通道数
*outputs :输出的图片(或特征图)的元素个数
*output :该层输出的图片(或特征图)
*/
int out_h, out_w, out_c, outputs;
float *output;
/*仅在softmax层使用, softmax的温度系数, 默认为1*/
float temperature;
/*
反向传播时相关参数:
*loss :损失函数,损失误差(损失函数是单个样本的)
*cost :代价函数(是多个样本的损失函数求和)
*delta :敏感度,即损失函数对当前层每个加权输入netj的偏导(梯度),-əE / ənetj
*weight_updatas :损失函数对权值的偏导,əE / əW
*bias_updates :损失函数对偏置项的偏导,əE / əb
*/
float *loss;
float *cost;
float *delta;
float *weight_updates;
float *bias_updates;
/*
dropout层相关参数:(这里用的是inverted_dropout)
proability :舍弃概率,则 1-proability为保留概率
scale :比例因子,是保留概率的倒数,用于缩放输入元素的值
rand :每个输入元素对应的随机数概率,用于和舍弃概率进行比较,从而判断输入元素是否置零
*/
float probability;
float scale;
float *rand;
/*
一个卷积核生成一个特征图的计算量,根据该计算量其获取内存空间
*/
size_t workspace_size;
/*
一次卷积运算所进行的浮点运算,这里是以十亿次浮点运算进行统计
*/
float bflops;
};