[转]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