卷积神经网络之padding操作

(一) 卷积神经网络之padding操作

为了构建深度神经网络,你需要学会使用的一个基本的卷积操作就是padding(以下都是基于卷积步长为1的情况下)

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

(1) 卷积的缺点

1.1 第一个缺点:图象缩小(输出缩小)

     第一个缺点是每次做卷积操作,你的图像就会缩小,从6×6缩小到4×4,你可能做了几次之后,你的图像就会变得很小了,可能会缩小到只有1×1的大小。你可不想让你的图像在每次识别边缘或其他特征时都缩小,当我们建立深度神经网络时,你就会知道你为什么不希望每进行一步操作图像都会缩小。比如当你有100层深层的网络,如果图像每经过一层都缩小的话,经过100层网络后,你就会得到一个很小的图像,所以这是个问题。

1.2 第二个缺点:图像边缘信息发挥的作用小

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

(2) Padding

为了解决上述问题,你可以在卷积操作之前填充这幅图像。

     在这个案例中,你可以沿着图像边缘再填充一层像素。如果你这样操作了,那么6×6的图像就被你填充成了一个8×8的图像。如果你用3×3的图像对这个8×8的图像卷积,你得到的输出就不是4×4的,而是6×6的图像,你就得到了一个尺寸和原始图像6×6的图像。习惯上,你可以用0去填充,如果是填充的数量,在这个案例中,,因为我们在周围都填充了一个像素点,输出也就变成了,所以就变成了,和输入的图像一样大。这个涂绿的像素点(左边矩阵)影响了输出中的这些格子(右边矩阵)。这样一来,角落或图像边缘的信息发挥的作用较小的这一缺点就被削弱了。
在这里插入图片描述
     刚才已经展示过用一个像素点来填充边缘,如果你想的话,也可以填充两个像素点,也就是说在这里填充一层。实际上你还可以填充更多像素。我这里画的这种情况,填充后 p = 2 p=2 p=2
在这里插入图片描述

2.1 padding的取值

     至于选择填充多少像素,通常有两个选择,分别叫做Valid卷积和Same卷积。

2.1.1 Valid卷积

     Valid卷积意味着不填充,这样的话,如果你有一个 n × n n×n n×n的图像,用一个 f × f f×f f×f的过滤器卷积,它将会给你一个 ( n − f + 1 ) × ( n − f + 1 ) (n-f+1)×(n-f+1) (nf+1)×(nf+1)维的输出。例如,有一个6×6的图像,通过一个3×3的过滤器,得到一个4×4的输出。

2.1.1 Same卷积

     Same卷积意味你填充后,你的输出大小和输入大小是一样的。根据这个公式 n − f + 1 n-f+1 nf+1,当你填充 p p p个像素点, n n n就变成了 n + 2 p n+2p n+2p,最后公式变为 n + 2 p − f + 1 n+2p-f+1 n+2pf+1。因此如果你有一个 n × n n×n n×n的图像,用 p p p个像素填充边缘,输出的大小就是这样的 ( n + 2 p − f + 1 ) × ( n + 2 p − f + 1 ) (n+2p-f+1)×(n+2p-f+1) (n+2pf+1)×(n+2pf+1)。如果你想让 n + 2 p − f + 1 = n n+2p-f+1=n n+2pf+1=n的话,使得输出和输入大小相等,如果你用这个等式求解 p p p,那么 p = ( f − 1 ) / 2 p=(f-1)/2 p=(f1)/2。所以当 f f f是一个奇数的时候,只要选择相应的填充尺寸,你就能确保得到和输入相同尺寸的输出。这也是为什么前面的例子,当过滤器是3×3时,使得输出尺寸等于输入尺寸,所需要的填充是(3-1)/2,也就是1个像素。另一个例子,当你的过滤器是5×5,如果 f = 5 f=5 f=5,然后代入那个式子,你就会发现需要2层填充使得输出和输入一样大,这是过滤器5×5的情况。
在这里插入图片描述

(3) 总结

     习惯上,计算机视觉中, f f f通常是奇数!
     为了指定卷积操作中的padding,你可以指定 p p p的值。也可以使用Valid卷积,也就是 p = 0 p=0 p=0。也可使用Same卷积填充像素,使你的输出和输入大小相同。

### 卷积神经网络Padding 的使用方法及作用 #### Padding 的定义与目的 Padding 是指在输入数据周围添加额外的像素层,通常这些像素被设置为零。这一操作的主要目的是为了控制输出特征图的空间维度大小以及保留更多的边界信息[^2]。 #### 输出尺寸计算公式 当处理一个 \( n \times n \) 大小的灰度图像并应用一个 \( f \times f \) 尺寸的滤波器时,在不考虑任何填充的情况下,经过一次标准卷积后的输出矩阵宽度和高度会变为: \[ W_{out} = (W_{in}-F+1)\div S + 1\] 这里 \(S\) 表示步幅(stride),即每次移动多少个单位;\( F \) 则代表过滤器(filter/kernel)边长。如果希望保持原始图片尺寸不变,则可以通过适当调整 padding 参数来实现这一点[^3]。 #### 常见类型的 Padding 方式 - **Valid Padding**: 不做任何形式上的补零扩展,默认情况下采用这种方式; - **Same Padding**: 添加适量数量的0值到四周使得最终得到的结果能够维持原图象相同尺度,具体来说就是让 `output size` 和 `input size` 相等或接近相等。 #### 实际应用场景下的效果展示 以 TensorFlow/Keras 中构建 CNN 层为例: ```python from tensorflow.keras.layers import Conv2D, ZeroPadding2D model.add(ZeroPadding2D(padding=(1, 1))) # 显式的增加一层 zero-padding model.add(Conv2D(filters=64, kernel_size=(3, 3), strides=(1, 1), padding='same')) # 或者直接指定 'same' 来自动完成 padding ``` 上述代码片段展示了如何显式地向模型中加入零填充层或将卷积层内的 padding 参数设为 same ,从而确保输出形状不会因为卷积而缩小太多。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>