我花了一整天时间试图弄清楚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卷积将翻转所有维度。
答案 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
,output
,i
计算 j
,以便可以完成对k
的索引。如果为input
选择其他选项,则索引将超过convn
,并为未知值填写零。