5.1自定义Layer
1、自定义layer的实现
a、选择继承的类
注:*任何一层都可以被继承,然后进行重写函数。
*尽量确保要实现的功能是否必须要自己写,不然尽量用已有的层,每一个层在caffe/include/caffe/layers源码中都有详细的介绍。
b、自定义神经层
步骤:
1、创建新定义的头文件include/caffe/layers/my_neuron_layer.hpp
* 重新Layer 名的方法:virtual inline const char* type() const{return “MyNeron”;}
* 如果只需要cpu方法的话,可以注释掉forward/backward_gpu()这两个方法
2、创建对应src/caffe/src/my_neuron_layer.cpp 的源文件
* 重写方法LayerSetUp,实现从prototxt读取参数
* 重写方法Reshape,如果对继承类没有修改的话,就不需要重写。
* 重写方法 Forward_cpu
* 重写方法Backward_cpu(非必须)
* 如果GPU 支持,则还需要创建src/caffe/src/my_neuron_layer.cu,同理重写方法 Forward_gpu/Backward_gpu(非必须)
3、proto/caffe.proto注册新 的layer
message Layer Parameter{
…
++optional MyNeuronParameter
mysquare_param =150;
…
}
…
++message MyNeuronParameter{
++ optional float power =1[default =2];
++}
…
message V1LayerParameter{
…
++MYNEURON=40;
…
}
4、my_neuron_layer.cpp 添加注册的宏定义
INSTANTIATE_CLASS(MyNeuronLayer);
REGISTER_LAYER_CLASS(MyNeuron);
如果有my_neuron_layer.cu,则添加
INSTANTIATE_LAYER_GPU_FUNCS(MyNeuronLayer);
5、重新编译和install
Name:”CaffeNet”
input:”data”
input_shape{
dim:1 #batchsize
dim:1 #number of colour channels -rgb
dim:28 # width
dim:28 #height
}
layer{
name:”myneuron”
type:”MyNeuron”
bottom:”data”
top:”data_out” }