深入理解卷积神经网络中的填充与步长(d2l-ai/d2l-en项目解析)

深入理解卷积神经网络中的填充与步长(d2l-ai/d2l-en项目解析)

d2l-en d2l-ai/d2l-en: 是一个基于 Python 的深度学习教程,它使用了 SQLite 数据库存储数据。适合用于学习深度学习,特别是对于需要使用 Python 和 SQLite 数据库的场景。特点是深度学习教程、Python、SQLite 数据库。 d2l-en 项目地址: https://gitcode.com/gh_mirrors/d2/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. 信息丢失问题:如引言所述,连续卷积会导致特征图尺寸快速缩小
  2. 边界信息利用不足:如图1所示,角落和边缘的像素在卷积过程中被利用的次数远少于中心像素

图1:不同尺寸卷积核对像素的利用率差异

填充的实现方式

填充的基本思想是在输入特征图的周围添加额外的"虚拟像素"(通常设置为0)。假设我们在高度方向添加$p_h$行填充,宽度方向添加$p_w$列填充,则输出尺寸变为:

$$(n_h-k_h+p_h+1) \times (n_w-k_w+p_w+1)$$

常见填充策略

  1. Valid卷积:不进行任何填充($p_h=p_w=0$)
  2. 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

为什么常用奇数尺寸卷积核

  1. 可以对称填充,保持空间对称性
  2. 有明确的中心位置,便于特征定位
  3. 实现输入输出尺寸一致时计算简单

步长(Stride)技术

步长的概念

步长定义了卷积窗口每次移动的距离。默认步长为1,表示逐个像素滑动。增大步长可以实现:

  1. 降采样:减少特征图尺寸
  2. 计算效率:减少计算量
  3. 感受野扩大:每个输出位置覆盖更大的输入区域

步长的数学表达

给定高度步长$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. 信息保留:对于需要精确定位的任务(如目标检测),通常使用小步长和适当填充
  2. 计算效率:大步长可以显著减少计算量,但可能损失空间信息
  3. 层次结构:深层网络通常使用更大步长来逐步降低分辨率

高级话题

  1. 非零填充:除零填充外,还可以使用反射填充、复制填充等,各有特点
  2. 分数步长:通过转置卷积实现上采样效果
  3. 空洞卷积:在不增加参数量的情况下扩大感受野

常见问题与解决方案

问题1:如何计算特定参数下的输出尺寸? 解答:使用前面给出的公式,注意考虑padding和stride的组合效果

问题2:音频信号中的步长有何特殊含义? 解答:在时间维度上,步长为2相当于将时间分辨率减半

问题3:如何实现镜像填充? 解答:可以使用框架特定的填充模式,如PyTorch中的padding_mode='reflect'

总结

填充和步长是CNN中控制特征图尺寸的两个关键参数:

  • 填充主要用于保持空间维度,防止信息过快丢失
  • 步长用于控制下采样率和计算效率
  • 合理组合两者可以构建高效的网络结构

理解这些概念对于设计高效的CNN架构至关重要,它们直接影响着网络的感受野、计算复杂度和特征表达能力。

d2l-en d2l-ai/d2l-en: 是一个基于 Python 的深度学习教程,它使用了 SQLite 数据库存储数据。适合用于学习深度学习,特别是对于需要使用 Python 和 SQLite 数据库的场景。特点是深度学习教程、Python、SQLite 数据库。 d2l-en 项目地址: https://gitcode.com/gh_mirrors/d2/d2l-en

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

孙双曙Janet

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值