caffe添加新的神经层
第一步:
创建新定义的头文件include/caffe/layers/my_neuron_layer.hpp
可以参考其他层的框架头文件等,继承神经层这个类
重新Layer名的方法:virtual inline const char* type() const{return "MyNeuron";}
如果只是需要cpu方法的话,可以注释掉forward_gpu()和backward_gpu()这两个方法
第二步:
创建对应src/caffe/src/my_neuron_layer.cpp的源文件
可以参考其他层的框架头文件等
重写方法LayerSetUp,实现能从prototxt读取参数,如果不需要读取参数则可以不重写
重写方法Reshape,如果对继承类没有修改的话,可以不用重写
重写方法Forward_cpu;caffe中自带有一些数学运算的函数。caffe中计算是矩阵运算
重写方法Backward_cpu(非必须)
如果要GPU支持,则需要创建src/caffe/src/my_neuron_layer.cu。同理重写方法
Forward_gpu/Backward_gpu(非必须)
第三步:
在proto/caffe.proto中注册新的Layer
message LayerParameter{
...
++optional MyNeuronParameter
mysquare_param=150;不能重复的标志号
...
}
...
++message MyNeuronParameter{
++optional float power =1{default=2};layer中的参数
++
}
...
message V1LayerParameter{
...
++MYNEURON=40;增加一个参数的设置
...
}
第四步myneuron_layer.cpp添加注册的宏定义
INSTANTIATE_CLASS(MyNeuronLayer);
REGISTER_LAYER_CLASS(MyNeuron);
如果有my_neuron_layer.cu,则添加
INSTANTIATE_LAYER_GPU_FUNCS(MyNeuronLayer);
第五步
重新编译caffe
第六步测试
可以写一个只有输入层和自定义层的prototxt
然后测试一下
测试程序如下:
import numpy as np
import matplotlib.pyplot as plt
import os
import sys
import caffe
deploy_file="./deploy.prototxt"
test_data="5,jpg"
if __name__ ='__main__':
net = caffe.Net(deploy_file,caffe.TEST)
transformer = caffe.io.Transformer({'data':net.blobs['data'].data.shape})
transformer.set_transpose('data',(2,0,3))
img= caffe.io.load_image(test_data,color=False)
net.blobs['data'].data[...]=transformer.preprocess('data',img)
print net.blobs['data'].data
out = net.forward()
print out['data_out']
其他:
自定义数据层
1、创建新定义的头文件include/caffe/layers/my_data_layer.hpp
重新Layer名的方法:virtual inline const char* type() const {return "MyData";}
2、重写LayerSetup,ShuffleImage,load_batch
3、proto/caffe.proto注册新得Layer
//my new data parameter
optional MyDataParameter my_data_param = 50
//my new data layer for infer image data
optional MyDataPatameter my_data_param=150
...
message MyDataParameter{
}