【问题标题】:how does convn function worksin matlab [duplicate]convn函数如何在matlab中工作[重复]
【发布时间】: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


【解决方案1】:

3D inputconvn 输出的元素 (i,j,k) 由以下公式计算:

[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

可以为每个ijk 计算output,以便可以完成对input 的索引。如果您为convn 选择不同的选项,则索引将超过input,并且会为未知值填充零。

【讨论】:

  • Cris Luengo 感谢您的回复。老实说,我无法理解您在这里写的内容。您知道通过示例可以更清楚地了解事情。请您使用我在帖子中给出的示例,并将您所说的内容应用于输出的第一个条目。你真是太好了
  • 我认为您的问题可能是您使用的是rot90,这会翻转前两个维度。您还需要翻转 aliñar 第 3 维。 flip(w,3)。 @abdelazizbotalb
  • Cris Luengo 非常感谢这正是问题所在,我已经在我的帖子中澄清了它。我不能投票给你,因为我需要超过 15 个声望。再次非常感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-02
  • 2014-07-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-03-07
  • 2018-06-10
相关资源
最近更新 更多