caffe自定义层

下面caffe代码的功能是通过一个卷积层,再将卷积层的输出结果通过自定义层,计算结果。
自定义函数前,现在caffe 的makefile中取消python层的注释
caffe自定义层_第1张图片
再进入caffe文件,重新编译:

make clear
make all -j8
make pycaffe

input_dim为定义的输入blobs[‘data’]的格式大小[1,3,100,100]=[batch_size,channel,h,w]

caffe定义

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来实现:
传入的参数为:
python_param {
module: ‘mypythonlayer’
layer: ‘MyLayer’
param_str: “‘num’: 21”
}
新建一个类MyLayer,继承自caffe.Layer,一般定义四个函数

  • setup:初始化参数num
self.num = yaml.load(self.param_str)["num"]
  • reshape
  • forward:前向传播
    输出的格式和输入的格式一致,然后将输入加上num,得到输出
top[0].reshape(*bottom[0].shape)  # top[0]为第一个输出
top[0].data[...] = bottom[0].data + self.num
  • backward:反向传播
    完整代码如下:
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,将12调到23的位置
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
    而我们现在输入的数据为[13496700],
    所以通过net.blobs['data'].reshape成输入的数据的格式

'''
net.blobs['data'].reshape(*im_input2.shape)
net.blobs['data'].data[...] = im_input2

# 5、转换好需要输入的格式后,即可将数据进行计算。
net.forward()

你可能感兴趣的