使用im2col层,重塑层和内积层实现局部连接层?

时间:2016-10-10 08:26:26

标签: deep-learning caffe

我正在使用caffe,它没有本地连接的图层。那么关于如何使用im2col层,重塑层和内积层来实现局部连接层的任何例子呢?感谢

1 个答案:

答案 0 :(得分:3)

个人观点:

我还尝试使用CropIm2colReshapeInnerProduct图层来实现本地连接的图层,但失败

因为当我想使用InnerProduct图层实现卷积操作时,我发现在InnerProductLayer<Dtype>::Forward_cpu()函数中:

caffe_cpu_gemm<Dtype>(CblasNoTrans, transpose_ ? CblasNoTrans : CblasTrans,
                      M_, N_, K_, (Dtype)1.,
                      bottom_data, weight, (Dtype)0., top_data);

并在BaseConvolutionLayer<Dtype>::forward_cpu_gemm()函数中:

caffe_cpu_gemm<Dtype>(CblasNoTrans, CblasNoTrans, conv_out_channels_ /
    group_, conv_out_spatial_dim_, kernel_dim_,
    (Dtype)1., weights + weight_offset_ * g, col_buff + col_offset_ * g,
    (Dtype)0., output + output_offset_ * g);

应该用作卷积内核的weight(s)被传递给caffe_cpu_gemm()的不同参数。

所以我无法使用InnerProductLayer<Dtype>::Forward_cpu()函数实现卷积运算,因此无法使用CropIm2col,{实现本地连接层(我的意思是局部卷积) {1}}和Reshape图层。

我的解决方案:

然而,我实现了一个局部卷积层here,它的想法是将输入要素图划分为InnerProduct网格(即使有重叠),并使用不同的内核对每个网格执行卷积。例如,输入要素贴图的形状为N*N,您希望将空间要素贴图(2, 3, 8, 8)划分为16 8*8个局部区域,然后对每个局部区域执行卷积内核,你可以写一个像这样的原型文本:

2*2

您可以轻松地将此图层添加到layer { name: "local_conv" type: "LocalConvolution" bottom: "bottom" # shape (2,3,8,8) top: "top" param { lr_mult: 1 decay_mult: 1 } param { lr_mult: 2 decay_mult: 0 } local_conv_param { local_region_number_h: 4 local_region_number_w: 4 local_region_ratio_h: 0.3 # determin the height/width of local regions local_region_ratio_w: 0.3 # local_region_size = floor(local_region_ratio * input_size) local_region_step_h: 2 # step between local regions on the top left part # and other regions will lie in the axial symmetry positions # automatically local_region_step_w: 2 num_output: 5 kernel_h: 3 kernel_w: 1 stride: 1 pad: 0 weight_filler { type: "xavier" } bias_filler { type: "constant" } } } ,相关文件为:

caffe

您还应该将include/caffe/layers/local_conv_layer.hpp src/caffe/layers/local_conv_layer.cpp(cu) message LocalConvolutionParameteroptional LocalConvolutionParameter local_conv_param添加到src/caffe/proto/caffe.proto