下面caffe代码的功能是通过一个卷积层,再将卷积层的输出结果通过自定义层,计算结果。
自定义函数前,现在caffe 的makefile中取消python层的注释
、
再进入caffe文件,重新编译:
make clear
make all -j8
make pycaffe
input_dim为定义的输入blobs[‘data’]的格式大小[1,3,100,100]=[batch_size,channel,h,w]
name: "convolution"
input: "data"
input_dim: 1
input_dim: 3
input_dim: 100
input_dim: 100
layer {
name: "conv"
type: "Convolution"
bottom: "data"
top: "conv"
convolution_param {
num_output: 3
kernel_size: 5
stride: 1
weight_filler {
type: "gaussian"
std: 0.01
}
bias_filler {
type: "constant"
value: 0
}
}
}
# 自定义层
layer {
name: 'MyPythonLayer'
type: 'Python'
top: 'output'
bottom: 'conv'
python_param {
module: 'mypythonlayer'
layer: 'MyLayer'
param_str: "'num': 21"
}
}
自定义层的功能就是将前一层的结果加上一个值。
下面用python来实现:
传入的参数为:
python_param {
module: ‘mypythonlayer’
layer: ‘MyLayer’
param_str: “‘num’: 21”
}
新建一个类MyLayer,继承自caffe.Layer,一般定义四个函数
self.num = yaml.load(self.param_str)["num"]
top[0].reshape(*bottom[0].shape) # top[0]为第一个输出
top[0].data[...] = bottom[0].data + self.num
class MyLayer(caffe.Layer):
def setup(self, bottom, top):
self.num = yaml.load(self.param_str)["num"] #查找参数名为num的参数并赋值
print "Parameter num : ", self.num
def reshape(self, bottom, top):
pass
def forward(self, bottom, top):
top[0].reshape(*bottom[0].shape)
print bottom[0].data.shape
print bottom[0].data
top[0].data[...] = bottom[0].data + self.num
print top[0].data[...]
def backward(self, top, propagate_down, bottom):
pass
caffe定义的输入blobs[‘data’]的格式大小[1,3,100,100]=[batch_size,channel,h,w]
而现在的输入为三维的图像[h,w,channel],需通过reshape转换维度,赋值,即可进行运算:
# 图像预处理:
net = caffe.Net('conv.prototxt',caffe.TEST)
# 1、原始的图像是三维的:[h,w,channel]
im = np.array(cv2.imread('timg.jpeg'))
print im.shape
# 2、通过np.newaxis新建一个维度,得到[1,h,w,channel]
im_input = im[np.newaxis, :, :]
print im_input.shape
# 3、而caffe需要的格式为[bach,channel,h,w],
# 所以调换一下维度的位置,将3调到1,将1,2调到2,3的位置
im_input2 = im_input.transpose((0,3,1,2))
print im_input2.shape
'''
# 4、因为caffe中定义net.blobs['data']的格式为:
input_dim: 1
input_dim: 3
input_dim: 100
input_dim: 100
而我们现在输入的数据为[1,3,496,700],
所以通过net.blobs['data'].reshape成输入的数据的格式
'''
net.blobs['data'].reshape(*im_input2.shape)
net.blobs['data'].data[...] = im_input2
# 5、转换好需要输入的格式后,即可将数据进行计算。
net.forward()