Layer类简介
- 至少有一个输入,输出Blob。
- 部分Layer带有权值和偏置项(如:激活层没有权值项)
- 前向传播对输入Blob处理,得到输出Blob。反向传播对输出的diff进行处理,得到输入的diff
ProtoBuffer描述
打开./caffe/src/caffe/caffe.proto文件,找到LayerParameter,查看对应的数据结构描述如下(根据这个数据结构描述,相当于约定,就可以自动生成对应的.hpp文件):
// 注意
// 定义了自己的层的话,一定要更新下一个可用ID
// 下一个ID是147,最近更新:recurrent_param
message LayerParameter {
optional string name = 1; // 可选参数,层的名字,string类型,下面类似
optional string type = 2; // 层的类型
repeated string bottom = 3; // 输入Blob对应的名字
repeated string top = 4; // 输出Blob的名字
// Train/Test阶段
optional Phase phase = 10;
// 每一层损失函数的权重,通常为0或者1,0表示不参与损失函数计算,1表示参与
repeated float loss_weight = 5;
// 具体的训练参数(比如相对于全局学习速率的缩放因子,权值衰减因子,这样就可以针对每一层设置不同的学习速率了)以及用于权值共享的名称(只有在需要权值共享的时候才需要名词)和其他设置,ParamSpec类型(这个类型的数据结构描述同样可以在当前文件中看到)
repeated ParamSpec param = 6;
// 该层的数值参数,BlobProto类型
repeated BlobProto blobs = 7;
// 是否需要对Bottom Blob进行反向传播,如果未指定,caffe会自动推断。该字段的维度数目应等于Bottom Blob的个数。即每层Bottom Blob都要指明是否需要反向传播
repeated bool propagate_down = 11;
// 根据当前网络状态规则,确定该层是否包含在网络中,如果没有指定任何规则,则一直被包含在网络中
repeated NetStateRule include = 8;
repeated NetStateRule exclude = 9;
// 数据预处理参数
optional TransformationParameter transform_param = 100;
// 所有损失层共享的参数
optional LossParameter loss_param = 101;
// 不同层类型的参数
// 注意,一些层实现可能有多种计算引擎(比如:caffe实现,以及cudnn实现),这些层包括一个引擎类型和一个引擎参数实现,默认引擎是在编译阶段的makefile里面设置的
optional AccuracyParameter accuracy_param = 102;
optional ArgMaxParameter argmax_param = 103;
optional BatchNormParameter batch_norm_param = 139;
optional BiasParameter bias_param = 141;
optional ConcatParameter concat_param = 104;
optional ContrastiveLossParameter contrastive_loss_param = 105;
optional ConvolutionParameter convolution_param = 106;
optional CropParameter crop_param = 144;
optional DataParameter data_param = 107;
optional DropoutParameter dropout_param = 108;
optional DummyDataParameter dummy_data_param = 109;
optional EltwiseParameter eltwise_param = 110;
optional ELUParameter elu_param = 140;
optional EmbedParameter embed_param = 137;
optional ExpParameter exp_param = 111;
optional FlattenParameter flatten_param = 135;
optional HDF5DataParameter hdf5_data_param = 112;
optional HDF5OutputParameter hdf5_output_param = 113;
optional HingeLossParameter hinge_loss_param = 114;
optional ImageDataParameter image_data_param = 115;
optional InfogainLossParameter infogain_loss_param = 116;
optional InnerProductParameter inner_product_param = 117;
optional InputParameter input_param = 143;
optional LogParameter log_param = 134;
optional LRNParameter lrn_param = 118;
optional MemoryDataParameter memory_data_param = 119;
optional MVNParameter mvn_param = 120;
optional ParameterParameter parameter_param = 145;
optional PoolingParameter pooling_param = 121;
optional PowerParameter power_param = 122;
optional PReLUParameter prelu_param = 131;
optional PythonParameter python_param = 130;
optional RecurrentParameter recurrent_param = 146;
optional ReductionParameter reduction_param = 136;
optional ReLUParameter relu_param = 123;
optional ReshapeParameter reshape_param = 133;
optional ScaleParameter scale_param = 142;
optional SigmoidParameter sigmoid_param = 124;
optional SoftmaxParameter softmax_param = 125;
optional SPPParameter spp_param = 132;
optional SliceParameter slice_param = 126;
optional TanHParameter tanh_param = 127;
optional ThresholdParameter threshold_param = 128;
optional TileParameter tile_param = 138;
optional WindowDataParameter window_data_param = 129;
}
Layer之间的继承关系
在看头文件声明之前,先看一下各个Layer之间的继承关系:

Layer类的派生类

Neuron Layers类继承关系
