我正在使用caffe,它没有本地连接的图层。那么关于如何使用im2col层,重塑层和内积层来实现局部连接层的任何例子呢?感谢
答案 0 :(得分:3)
我还尝试使用Crop
,Im2col
,Reshape
和InnerProduct
图层来实现本地连接的图层,但失败。
因为当我想使用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()
函数实现卷积运算,因此无法使用Crop
,Im2col
,{实现本地连接层(我的意思是局部卷积) {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 LocalConvolutionParameter
从optional LocalConvolutionParameter local_conv_param
添加到src/caffe/proto/caffe.proto
。