将卷积实现为矩阵乘法

时间:2016-03-07 19:07:57

标签: matlab computer-vision deep-learning convolution caffe

Pithy:帮助Matlab脚本从Caffe获取ImageData数组和卷积权重并返回卷积。请。

我正在尝试在Matlab中重新创建由Caffe生成的卷积。

让我们做出以下定义

W**2 = Size of input
F**2 = Size of filter
P = Size of padding
S = Stride
K = Number of filters

以下文本描述了如何将卷积一般化为矩阵乘法:

  

输入图像中的局部区域在通常称为im2col的操作中被拉伸成列。例如,如果输入为[227x227x3]并且要在步幅4处与11x11x3滤波器进行卷积,那么我们将在输入中采用[11x11x3]像素块并将每个块拉伸为大小为11 * 11 *的列向量3 = 363.在步长为4的输入中迭代此过程,沿宽度和高度给出(227-11)/ 4 + 1 = 55个位置,从而得到尺寸为[363 x 3025]的im2col的输出矩阵X_col,其中每列都是伸展的感受野,总共有55 * 55 = 3025。请注意,由于感知字段重叠,因此输入卷中的每个数字都可能在多个不同的列中重复。

由此可以得出结论:im2col函数调用看起来像这样:

input = im2col( input, [3*F*F, ((W-F)/S+1)**2)])

但是,如果我使用以下参数值

W = 5
F = 3
P = 1
S = 2
K = 2

我得到以下尺寸

>> size(input)

ans =

     1     3     5     5

>> size(output)

ans =

     1     2     3     3

>> size(filter)

ans =

     2     3     3     3

如果我使用上面的im2col函数调用,我最终得到一个空矩阵。

如果我在上例中将步幅更改为1,则输入,输出和滤波器的大小保持不变。如果我使用Matlab的'convn'命令,则大小与Caffe的实际输出不同。

>> size(convn(input,filter))                                  

ans =

     2     5     7     7

为矩阵乘法调整数组大小的一般方法是什么?

1 个答案:

答案 0 :(得分:0)

您使用im2col错误的第二个参数,请参阅the documentation

你应该给它试图在图像上滑动的过滤器窗口的大小,即:

cols = im2col( input, [F, F])