如何使用matlab中的convn函数

时间:2018-04-03 04:49:41

标签: matlab

我花了一整天时间试图弄清楚convn函数在3阶张量的“有效”模式下是如何工作的。我有一个大小为3 * 3 * 2的输入i和一个大小为2 * 2 * 2的滤波器w,但卷积后的输出大小为2 * 2,如下图所示。我只需要了解如何在输入1的两个通道上执行卷积的点积。请展示如何通过convn函数计算输出的第一个条目。请注意,我正在旋转180度,以执行互相关而不是卷积,只是为了便于手动计算检查。非常感谢提前。此图片包含输入和过滤值im1的简单示例,此图片包含结束后的结果im2

EDIT 这是命令窗口中的副本

K>> i

i(:,:,1) =
 1     5     4
 7     8     9
 1     2     6


i(:,:,2) =
 3     4     6
 7     1     3
 1     2     6

K>> w
w(:,:,1) =
 1     2
 5     3


w(:,:,2) =
 4     3
 8     4

K>> convn(i,rot90(w,2), 'valid')

ans =

   156   162
    88   134

我绝对明白卷积是什么以及它在离散和继续形式中做了什么,我也理解matlab的不同模式“完全”“相同”和“有效”。当我切换到超过二阶的张量时,我感到困惑。我手工修补了许多检查,但我无法得到函数本身给出的正确结果

问题已解决: 当我们分解卷积时,我们得到了这个:

K>> convn(i(:,:,1),rot90(w(:,:,1),2), 'valid')

ans =

    70    80
    34    54



K>> convn(i(:,:,1),rot90(w(:,:,2),2), 'valid')

ans =

   107   132
    68    99

现在整个3d张量的卷积将给出:

K>> convn(i,rot90(w,2), 'valid')

ans =

   156   162
    88   134

如果我们想手动检查输出结果,添加从分解卷积获得的结果的第一个条目更有意义。

例如,结果的第一个条目是156但是添加了107 + 70 = 177这不是rue,而这一直让我感到困惑。

当我们使用rot90时,不仅可以翻转过滤器,还可以进行计算。这意味着滤波器w的FIRST通道(矩阵)将与输入的SECOND通道进行卷积,W的SECOND通道将与输入的FIRST通道进行卷积,如下所示:

 K>> convn(i(:,:,1),rot90(w(:,:,2),2), 'valid')

ans =

   107   132
    68    99

K>> convn(i(:,:,2),rot90(w(:,:,1),2), 'valid')

ans =

    49    30
    20    35

现在49 + 107 = 156,而20 + 68 = 88等等,因此这些匹配整个3d张量的输出结果。

结论带走:使用带有rot90的N-D卷积将翻转所有维度。

1 个答案:

答案 0 :(得分:1)

3D (i,j,k)的{​​{1}}输出的元素convn由以下公式计算:

input
可以为每个[n,m,l] = size(w); w_flipped = flip(w); % ^ except this flip is over each dimension output(i,j,k) = sum( input( i+(1:n)-1, j+(1:m)-1, k+(1:l)-1 ) .* w_flipped ); % ^ except this sum is over all dimensions outputi计算

j,以便可以完成对k的索引。如果为input选择其他选项,则索引将超过convn,并为未知值填写零。