Caffe学习之自定义创建新的Layer层

转载:https://blog.****.net/BVL10101111/article/details/74837156

一.创建.hpp文件

1.添加你的layer头文件置于 include/caffe/layers/ 下,比如include/caffe/layers/your_layer.hpp

2.your_layer继承选择继承layer.hpp, common_layers.hpp, data_layers.hpp, loss_layers.hpp, neuron_layers.hpp, 或者 vision_layers.hpp其中一种

3.重写virtual inline const char* type() const { return "YourLayerName"; }函数,这个的目的是为了在写net.prototxt时,layer{type:"YourLayerName"}有所对应

4.根据自己layer的需要,对{*}blob部分方法进行重写,以此来限制bottom和top的blob个数。比如 要是重写了 virtual inline int ExactNumBottomBlobs() const { return 1; }就表示限制bottom的blob为1

5.申明
virtual void LayerSetUp(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top);
virtual void Reshape(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top);
virtual void Forward_cpu(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top);
virtual void Backward_cpu(const vector<Blob<Dtype>*>& top,const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);

6.要是需要GPU加速,则需申明:
virtual void Forward_gpu(const vector<Blob<Dtype>*>& bottom,const vector<Blob<Dtype>*>& top);
virtual void Backward_gpu(const vector<Blob<Dtype>*>& top,const vector<bool>& propagate_down, const vector<Blob<Dtype>*>& bottom);

7.其他(根据算法需要的函数以及参数)

可以在/caffe/include/caffe/下找到许多对应的例子,比如inner_product_layer.hpp:

Caffe学习之自定义创建新的Layer层

二.创建对应的.cpp文件

1 添加你的源文件置于 src/caffe/layers/下,比如 src/caffe/layers/your_layer.cpp

2.实现LayerSetUp方法(在这里你可以读取layer的参数,权重进行初始化等等),该方法在layer::SetUp时候被调用,用于layer的初始化

3.实现Reshape 方法,根据bottom的shape,修改top的shape等等,也是在layer::SetUp时候被调用,用于layer的初始化

4.实现Forward_cpu和Backward_cpu 方法,前向传播计算loss和top,反向传播计算diff(梯度)

5.在文件末尾加上这两行代码(XXXLayer表示layer的类名),以此在fayer_factory.hpp中注册了此layer以便于运行时的统一创建
INSTANTIATE_CLASS(XXXLayer);
REGISTER_LAYER_CLASS(XXX);

具体例子可参考here

三.创建.cu文件


1.如果需要gpu加速的话,那么你需要在src/caffe/layers/下创建.cu文件,比如src/caffe/layers/your_layer.cu

2.采用cuda语言编程,实现Forward_gpu和Backward_gpu方法,和.cpp文件中Forward_cpu和Backward_cpu 方法实现类似,需要把所有的cpu字样改成gpu

具体例子参考here

四.在caffe.proto添加your_layer的message

1.如果想要在net.prototxt中设置你的layer的参数的话,你需要在caffe.proto中定义,定义好之后,即可在forward或者backward的方法中获取到参数值,进行其他相关运算

一个简单的例子(InnerProductLayer )如下:
Caffe学习之自定义创建新的Layer层

2.与此同时,在caffe.proto 的message LayerParameter中添加对应的消息,同时更新一**释,表明下一个可用的数字大小,比如:

Caffe学习之自定义创建新的Layer层

五.编译

最后重新编译一下caffe代码即可

Caffe学习之自定义创建新的Layer层
————————————————
版权声明:本文为****博主「BVL10101111」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.****.net/BVL10101111/article/details/74837156