caffe源码中已经帮我封装好了各种各样的layer,但是有时候现有的layer不能满足设计的网络要求,这个时候需要自己定义一个新的layer,本文参考here,进行简单讲解,具体方式如下:
一.创建.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为15.申明
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:
#ifndef CAFFE_INNER_PRODUCT_LAYER_HPP_
#define CAFFE_INNER_PRODUCT_LAYER_HPP_
#include <vector>
#include "caffe/blob.hpp"