卷积层:填充还是不填充?
填充很重要的原因有两个:
如果我们保留
height
andwidth
并且在从一层到另一层时不必过多担心张量维度,则设计网络会更容易,因为维度只会“起作用”。它允许我们设计更深层次的网络。如果没有填充,体积大小的减小会过快地减小。
填充实际上通过在边界处保留信息来提高性能。
引用斯坦福讲座:“除了上述在 CONV 之后保持空间大小不变的好处之外,这样做实际上可以提高性能。如果 CONV 层不对输入进行零填充并且只执行有效的卷积,那么每次 CONV 后体积会减少少量,并且边界处的信息会被“冲走”得太快。” -来源
- 正如@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 填充速度很快并且可以保持大小,所以这就是我们这样做的原因。