深入理解卷积神经网络中的填充与步长(d2l-ai/d2l-en项目解析)
引言
在卷积神经网络(CNN)中,填充(padding)和步长(stride)是两个至关重要的超参数,它们直接影响着特征图的空间维度和网络的计算效率。本文将系统性地解析这两个概念,帮助读者掌握它们在CNN中的工作原理和应用技巧。
卷积操作的基本原理
首先回顾标准卷积操作的基本特性:对于一个输入尺寸为$n_h \times n_w$的特征图,使用$k_h \times k_w$的卷积核进行卷积运算后,输出尺寸将变为$(n_h-k_h+1) \times (n_w-k_w+1)$。这意味着每进行一次卷积操作,特征图的尺寸就会缩小。
实际影响:假设我们处理一张240×240像素的图像,经过10层5×5的卷积后,图像尺寸会缩小到200×200,丢失了约30%的边界信息。这对于需要保留完整空间信息的任务(如图像分割)来说是不可接受的。
填充(Padding)技术
为什么需要填充?
- 信息丢失问题:如引言所述,连续卷积会导致特征图尺寸快速缩小
- 边界信息利用不足:如图1所示,角落和边缘的像素在卷积过程中被利用的次数远少于中心像素
填充的实现方式
填充的基本思想是在输入特征图的周围添加额外的"虚拟像素"(通常设置为0)。假设我们在高度方向添加$p_h$行填充,宽度方向添加$p_w$列填充,则输出尺寸变为:
$$(n_h-k_h+p_h+1) \times (n_w-k_w+p_w+1)$$
常见填充策略:
- Valid卷积:不进行任何填充($p_h=p_w=0$)
- Same卷积:填充使得输出尺寸与输入相同
- 对于奇数尺寸的卷积核:$p_h=k_h-1$, $p_w=k_w-1$
- 对于偶数尺寸的卷积核:需要非对称填充
代码实践
# 使用3×3卷积核,1像素填充(Same卷积)
conv2d = nn.Conv2D(1, kernel_size=3, padding=1)
X = random_tensor(size=(8, 8))
output = conv2d(X) # 输出仍为8×8
为什么常用奇数尺寸卷积核:
- 可以对称填充,保持空间对称性
- 有明确的中心位置,便于特征定位
- 实现输入输出尺寸一致时计算简单
步长(Stride)技术
步长的概念
步长定义了卷积窗口每次移动的距离。默认步长为1,表示逐个像素滑动。增大步长可以实现:
- 降采样:减少特征图尺寸
- 计算效率:减少计算量
- 感受野扩大:每个输出位置覆盖更大的输入区域
步长的数学表达
给定高度步长$s_h$和宽度步长$s_w$,输出尺寸为:
$$\lfloor(n_h-k_h+p_h+s_h)/s_h\rfloor \times \lfloor(n_w-k_w+p_w+s_w)/s_w\rfloor$$
特殊情况:
- 当输入尺寸能被步长整除时:$(n_h/s_h) \times (n_w/s_w)$
- 当使用Same填充时:$\lfloor(n_h+s_h-1)/s_h\rfloor \times \lfloor(n_w+s_w-1)/s_w\rfloor$
代码示例
# 使用3×3卷积核,步长为2
conv2d = nn.Conv2D(1, kernel_size=3, padding=1, strides=2)
X = random_tensor(size=(8, 8))
output = conv2d(X) # 输出为4×4
非对称步长示例:
# 高度步长3,宽度步长4
conv2d = nn.Conv2D(1, kernel_size=(3,5), padding=(0,1), strides=(3,4))
X = random_tensor(size=(8, 8))
output = conv2d(X) # 输出为2×2
填充与步长的综合应用
设计考量
- 信息保留:对于需要精确定位的任务(如目标检测),通常使用小步长和适当填充
- 计算效率:大步长可以显著减少计算量,但可能损失空间信息
- 层次结构:深层网络通常使用更大步长来逐步降低分辨率
高级话题
- 非零填充:除零填充外,还可以使用反射填充、复制填充等,各有特点
- 分数步长:通过转置卷积实现上采样效果
- 空洞卷积:在不增加参数量的情况下扩大感受野
常见问题与解决方案
问题1:如何计算特定参数下的输出尺寸? 解答:使用前面给出的公式,注意考虑padding和stride的组合效果
问题2:音频信号中的步长有何特殊含义? 解答:在时间维度上,步长为2相当于将时间分辨率减半
问题3:如何实现镜像填充? 解答:可以使用框架特定的填充模式,如PyTorch中的padding_mode='reflect'
总结
填充和步长是CNN中控制特征图尺寸的两个关键参数:
- 填充主要用于保持空间维度,防止信息过快丢失
- 步长用于控制下采样率和计算效率
- 合理组合两者可以构建高效的网络结构
理解这些概念对于设计高效的CNN架构至关重要,它们直接影响着网络的感受野、计算复杂度和特征表达能力。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考