卷积神经网络中的填充与步幅技术解析
引言
在卷积神经网络(CNN)中,填充(padding)和步幅(stride)是两个至关重要的超参数,它们直接影响着卷积层的输出尺寸以及特征提取的效果。本文将深入解析这两个概念,帮助读者理解它们在CNN中的作用机制和实际应用。
填充(Padding)的作用与实现
为什么需要填充
当我们在CNN中连续应用多层卷积操作时,会发现输出特征图的尺寸逐渐缩小。这是因为每个卷积核都会"吃掉"输入图像边缘的一些像素信息。以一个240×240像素的图像为例,经过10层5×5的卷积后,尺寸会缩小到200×200,这意味着原始图像边界的大量信息丢失了。
填充技术通过在输入图像的边缘添加额外的像素(通常填充0值)来解决这个问题。通过填充,我们可以:
- 保持输入和输出的空间维度一致
- 防止图像边缘信息过快丢失
- 更好地控制网络架构中的特征图尺寸
填充的计算方法
假设输入形状为nₕ×n_w,卷积核形状为kₕ×k_w,当我们在高度方向填充pₕ行,宽度方向填充p_w列时,输出形状变为:
(nₕ - kₕ + pₕ + 1) × (n_w - k_w + p_w + 1)
在实际应用中,我们通常选择:
- 卷积核尺寸为奇数(如3×3、5×5等)
- 填充量p = k - 1
- 在高度和宽度两侧均匀分配填充量
这种配置使得输出尺寸与输入尺寸保持一致,同时保持了计算上的对称性。
代码示例
以下是使用不同填充方式的代码示例:
# 3×3卷积核,每边填充1行/列(共填充2行/列)
conv2d = nn.Conv2D(1, kernel_size=3, padding=1)
# 5×3卷积核,高度填充2行,宽度填充1列
conv2d = nn.Conv2D(1, kernel_size=(5,3), padding=(2,1))
步幅(Stride)的作用与实现
步幅的基本概念
步幅决定了卷积核在输入图像上滑动的步长。默认步幅为1,表示卷积核每次移动一个像素。增大步幅可以:
- 显著降低特征图的空间维度
- 减少计算量
- 扩大感受野(每个输出像素对应更大的输入区域)
步幅的计算方法
当垂直步幅为sₕ,水平步幅为s_w时,输出形状为:
⌊(nₕ - kₕ + pₕ + sₕ)/sₕ⌋ × ⌊(n_w - k_w + p_w + s_w)/s_w⌋
如果设置pₕ = kₕ - 1且p_w = k_w - 1,公式可简化为:
⌊(nₕ + sₕ - 1)/sₕ⌋ × ⌊(n_w + s_w - 1)/s_w⌋
当输入尺寸能被步幅整除时,输出尺寸就是输入尺寸除以步幅。
代码示例
以下是使用不同步幅的代码示例:
# 3×3卷积核,步幅为2,输出尺寸减半
conv2d = nn.Conv2D(1, kernel_size=3, padding=1, strides=2)
# 3×5卷积核,垂直步幅3,水平步幅4
conv2d = nn.Conv2D(1, kernel_size=(3,5), padding=(0,1), strides=(3,4))
填充与步幅的联合应用
在实际网络设计中,填充和步幅常常配合使用:
- 保持尺寸模式:使用适当的填充(padding)和步幅1(stride=1)来保持特征图尺寸
- 下采样模式:使用步幅2(stride=2)和适当填充来实现尺寸减半
- 非对称模式:在高度和宽度方向使用不同的填充和步幅值
实际应用建议
- 对于大多数情况,推荐使用奇数尺寸的卷积核(3×3、5×5等)
- 保持高度和宽度方向的填充和步幅对称(sₕ = s_w, pₕ = p_w)
- 在需要下采样时,可以考虑使用步幅2卷积代替池化层
- 在网络深层可以适当增大步幅以减少计算量
总结
填充和步幅是CNN中控制特征图尺寸的两个关键参数:
- 填充主要用于保持特征图尺寸,防止信息丢失
- 步幅主要用于降低特征图尺寸,减少计算量
- 合理组合两者可以实现灵活的特征图尺寸控制
理解并掌握这两个概念,对于设计和优化卷积神经网络架构至关重要。通过调整填充和步幅,我们可以在特征提取能力和计算效率之间找到最佳平衡点。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考