【发布时间】:2018-04-03 04:49:40
【问题描述】:
我花了一整天的时间试图弄清楚 convn 函数如何在 3 阶张量的“有效”模式下工作。我有一个大小为 3*3*2 的输入 i 和一个大小为 2*2*2 的滤波器 w,但卷积后的输出大小为 2*2,如下图链接所示。我只需要了解卷积的点积是如何在输入 1 的两个通道上执行的。如果你能证明输出的第一个条目是如何通过 convn 函数计算的。请注意,我将 w 旋转 180 度以执行互相关而不是卷积,只是为了便于手动计算检查。非常感谢。这张图片包括输入和过滤值的简单示例im1,这张图片包括convn之后的结果im2
编辑 这是来自命令窗口的副本
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 convn 'full' 'same' 和 'valid' 的不同模式。当我切换到二阶以上的张量时,我感到困惑。我手动做了很多检查,但我无法得到函数本身给出的正确结果
问题已解决: 当我们分解卷积时,我们得到:
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,这是不正确的,这一直让我感到困惑。
当我们使用 rot90 时,不仅过滤器被翻转,而且计算是如何完成的。这意味着滤波器 w 的第一个通道(矩阵)将与输入的第二个通道进行卷积,并且 w 的第二个通道将与输入的第一个通道进行卷积,如下所示:
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 卷积将翻转所有维度。
【问题讨论】:
-
请不要发布文本的屏幕截图,您可以从 MATLAB 复制粘贴该文本。
-
如果你知道什么是卷积,你就会明白过滤器
w完全适合输入i的某些移位。这就是“有效”模式返回的内容。 -
Cris Luengo 只是展示了结果的第一个条目是如何计算的,因为我很困惑
标签: matlab