[转]Caffe学习 自定义创建新的Layer层

Caffe源码中已经帮我们封装好了各种各样的layer,但是有时候现有的layer不能满足设计的网络要求,这个时候需要自己定义一个新的layer,本文参考https://github.com/BVLC/caffe/wiki/Development,进行简单讲解,具体方式如下:

一、创建.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* typr() const {return “YourLayerName”;}函数,这个目的是为了在写net.prototxt时,layer{type: “YourLayerName”}有所对应

4、          根据自己Layer的需要,对{*}blob部分方法进行重写,以此来限制bottom和top的blob个数。比如要是重写了virtual inline int ExactNumBottomBlobs() const {return1;}就表示限制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>*>& bottom, const vector<Blob<Dtype>*>& top);

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、          其他(根据算法需要的函数以及参数)

 

二、创建对应的.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的类名),以此在layer_factory.hpp中注册此layer

INSTANTIATE_CLASS(XXXLayer);

REGISTER_LAYER_CLASS(XXX);

 

三、创建.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

 

四、在caffe.proto添加your_layer的message

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

2、  同时,在caffe.proto的message LayerParameter中添加对应的消息,同时更新一下注释,表明下一个可用的数字大小。

 

五、编译

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

CAFFE_ROOT$

make clean

make all

转自:http://blog.csdn.net/bvl10101111/article/details/74837156

posted @ 2018-03-04 16:01  stay_heart  阅读(118)  评论(0编辑  收藏  举报