Padding

如果你用一个 3×3 的过滤器卷积一个 6×6 的图像,你最后会得到一个 4×4 的输出,也就是一个 4×4 矩阵。那是因为你的 3×3 过滤器在 6×6 矩阵中,只可能有 4×4 种可能的位置。这背后的数学解释是,如果我们有一个n×n的图像,用f×f的过滤器做卷积,那么输出的维度就是(n − f + 1) ×(n − f + 1)。在这个例子里是6 − 3 + 1 = 4,因此得到了一个 4×4 的输出。

这样的话会有两个缺点,第一个缺点是每次做卷积操作,你的图像就会缩小,从 6×6 缩小到 4×4,你可能做了几次之后,你的图像就会变得很小了,可能会缩小到只有 1×1 的大小。你可不想让你的图像在每次识别边缘或其他特征时都缩小,这就是第一个缺点。

第二个缺点时,如果你注意角落边缘的像素,这个像素点(绿色阴影标记)只被一个输出所触碰或者使用,因为它位于这个 3×3 的区域的一角。但如果是在中间的像素点,比如这个(红色方框标记),就会有许多 3×3 的区域与之重叠。所以那些在角落或者边缘区域的像素点在输出中采用较少,意味着你丢掉了图像边缘位置的许多信息。

1-4 Padding_卷积

比如当你有 100 层深层的网络,如果图像每经过一层都缩小的话,经过 100 层网络后,你就会得到一个很小的图像,所以这是个问题。另一个问题是图像边缘的大部分信息都丢失了。为了解决这些问题,你可以在卷积操作之前填充这幅图像。在这个案例中,你可以沿着图像边缘再填充一层像素。如果你这样操作了,那么 6×6 的图像就被你填充成了一个 8×8 的图像。如果你用 3×3 的图像对这个 8×8 的图像卷积,你得到的输出就不是 4×4 的,而是 6×6的图像,你就得到了一个尺寸和原始图像 6×6 的图像。习惯上,你可以用 0 去填充,如果p是填充的数量,在这个案例中, p= 1,因为我们在周围都填充了一个像素点,输出也就变成了(n + 2p − f + 1) × (n + 2p − f + 1),所以就变成了(6 + 2 × 1 − 3 + 1) × (6 + 2 × 1 −3 + 1) = 6 × 6,和输入的图像一样大。这个涂绿的像素点(左边矩阵)影响了输出中的这些格子(右边矩阵)。这样一来,丢失信息或者更准确来说角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。

1-4 Padding_卷积_02

刚才我已经展示过用一个像素点来填充边缘,如果你想的话,也可以填充两个像素点,也就是说在这里填充一层。实际上你还可以填充更多像素。

至于选择填充多少像素,通常有两个选择,分别叫做 Valid 卷积和 Same 卷积。Valid 卷积意味着不填充,这样的话,如果你有一个n × n的图像,用一个f× f的过滤器卷积,它将会给你一个(n− f + 1) × (n− f + 1)维的输出。例如,有一个 6×6 的图像,通过一个 3×3 的过滤器,得到一个 4×4 的输出。

另一个经常被用到的填充方法叫做 Same 卷积,那意味你填充后,你的输出大小和输入大小是一样的。根据这个公式n− f + 1,当你填充p个像素点,n就变成了n + 2p,最后公式变为n + 2p − f+ 1。因此如果你有一个n × n的图像,用n个像素填充边缘,输出的大小就

是这样的(n + 2p − f+ 1) × (n + 2p − f+ 1)。如果你想让n + 2p − f+ 1 = n的话,使得输出和输入大小相等,如果你用这个等式求解p,那么p = (f− 1)/2。所以当是一个奇数的时候,只要选择相应的填充尺寸,你就能确保得到和输入相同尺寸的输出。

习惯上,计算机视觉中, f通常是奇数,甚至可能都是这样。你很少看到一个偶数的过滤器在计算机视觉里使用,我认为有两个原因:

其中一个可能是,如果f是一个偶数,那么你只能使用一些不对称填充。只有是奇数的情况下, Same 卷积才会有自然的填充,我们可以以同样的数量填充四周,而不是左边填充多一点,右边填充少一点,这样不对称的填充。

第二个原因是当你有一个奇数维过滤器,比如 3×3 或者 5×5 的,它就有一个中心点。有时在计算机视觉里,如果有一个中心像素点会更方便,便于指出过滤器的位置。