5、自定义Layer

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” }

猜你喜欢

转载自blog.csdn.net/wtj318_/article/details/82856683