卷积层:填充还是不填充?

机器算法验证 卷积神经网络 卷积
2022-01-18 02:06:24

AlexNet 架构使用零填充,如图所示。但是,论文中没有解释为什么要引入这种填充。

在此处输入图像描述

Standford CS 231n 课程教我们使用填充来保持空间大小: 在此处输入图像描述

我很好奇这是否是零填充的唯一原因?谁能解释零填充背后的基本原理?谢谢!

我问的原因

假设我不需要保留空间大小。我可以只删除填充然后不损失性能吗?我知道随着我们进入更深的层,它会导致空间大小的快速减小,但我也可以通过移除池化层来权衡这一点。

4个回答

填充很重要的原因有两个:

  1. 如果我们保留heightandwidth并且在从一层到另一层时不必过多担心张量维度,则设计网络会更容易,因为维度只会“起作用”

  2. 它允许我们设计更深层次的网络如果没有填充,体积大小的减小会过快地减小。

  3. 填充实际上通过在边界处保留信息来提高性能

引用斯坦福讲座:“除了上述在 CONV 之后保持空间大小不变的好处之外,这样做实际上可以提高性能。如果 CONV 层不对输入进行零填充并且只执行有效的卷积,那么每次 CONV 后体积会减少少量,并且边界处的信息会被“冲走”得太快。” -来源

  1. 正如@dontloo 已经说过的那样,新的网络架构需要将卷积层与 1x1、3x3 和 5x5 过滤器连接起来,如果它们不使用填充是不可能的,因为尺寸不匹配。检查这个 inception 模块的图像,以更好地理解为什么填充在这里有用。

在此处输入图像描述

在我看来,最重要的原因是保持空间大小。正如你所说,我们可以通过移除池化层来权衡空间大小的减少。然而,许多最近的网络结构(如残差网络初始网络分形网络)对不同层的输出进行操作,这需要它们之间的空间大小一致。

另一件事是,如果没有填充,输入角落的像素只会影响输出对应角落的像素,而中心的像素会影响输出中的邻域。当几个无填充层堆叠在一起时,网络会忽略图像的边界像素。

只是我的一些理解,我相信还有其他很好的理由。

这里已经有一些非常好的答案。我想添加一些关于图像边框效果(已经提到过)的更多细节,这取决于所使用的填充类型。

深度学习中有 3 种相关的填充类型:

  • 有效(根本没有填充)
  • 相同(通过在图像周围添加零来保持图像大小 - 这就是您所说的,这就是在深度学习上下文中大部分时间被称为“零填充”的内容)
  • full(确保所有像素对输出的影响相同,甚至在图像周围添加更多的零,输出大于输入)

这是这 3 种填充类型如何工作的草图,其中 x 是大小为 3 的输入,k 是大小为 3 的内核(移动到所有可能的位置),y 是输出,0 表示零填充:

valid:
xxx
kkk
 y

same:  
0xxx0
kkk
 kkk
  kkk
 yyy

full:
00xxx00
kkk
 kkk
  kkk
   kkk
    kkk
 yyyyy

让我们看看由 3x3 卷积核处理的 10x10 输入图像中的像素对输出(左相同,右有效填充)有多大影响(内核“触摸”像素的频率):

在此处输入图像描述

如您所见,使用相同的填充,边界像素的影响比中心像素的影响小,因此相同的填充完全消除边界效应是不正确的(有时可以在互联网上阅读)。对于有效的填充,这个问题更加严重。另一方面,使用全填充时,所有像素对输出的影响相同。

随着网络变得更深,问题变得更加激烈 - 无论是有效填充还是相同填充。

我总结了我所做的填充实验的发现,这里有一篇关于这个主题的有趣论文。

好问题。Drag0 解释得很好,但我同意,有些不对劲。

这就像看一张照片,不得不处理边界。在现实生活中,你可以移动你的眼睛看得更远;不存在真正的边界。所以这是媒介的限制。

除了保持大小,这重要吗?我不知道一个令人满意的答案,但我推测(未经证实)通过注意力和遮挡(部分对象)的实验,我们不需要在边界上丢失的信息。如果你要做一些更聪明的事情(比如复制它旁边的像素),它不会改变答案,尽管我自己没有尝试过。用 0 填充速度很快并且可以保持大小,所以这就是我们这样做的原因。