想让输出变小、看得更远,有两个旋钮:步幅和空洞。两者都不增加参数。 步幅 s 让核每次跳 s 格,输出变成 floor((H + 2p − F)/s) + 1。 实测 7×7 配 3×3:步幅 1 得 5×5、2 得 3×3、3 得 2×2。 空洞率 d 让核的点之间留空,有效核变成 F + (F − 1)(d − 1)。 实测 d=3 时有效核 7×7、输出 1×1,参数还是 9 个。
5.5 的补零是「加」,这一节的步幅是「减」,两个旋钮合起来就是完整的尺寸公式。 5.8 的池化层也能缩尺寸,但它没有参数、只取代表;步幅卷积是「边缩边学」。 这一节的空洞卷积在语义分割里是主力,本书不讲那些网络,但机制在这里。
一、步幅:核每次跳几格
步幅 1 是逐格滑,步幅 2 是隔一格滑。跳过的像素不参与这一步的计算。 输出边长 = floor((H + 2p − F)/s) + 1。向下取整很重要,除不尽时丢掉的是右边和下边。 实测 7×7 配 3×3:s=1 得 5×5、s=2 得 3×3、s=3 得 2×2。 s=3 时 4 除以 3 得 1.33,取整是 1,加 1 才是 2。
二、步幅的代价
步幅 2 相当于在卷积的同时做了一次下采样。信息是被跳过,不是被压缩。 分类任务里早期降采样没问题(细节不重要),但分割和检测要小心,跳掉的像素可能正是目标。 池化也能降采样,但池化只是取最大值;步幅卷积是「学一个降采样方式」。 所以现代网络越来越倾向用步幅卷积替代池化。
三、空洞:核中间留空
空洞率 d 表示核的点之间隔 d − 1 个空格。d=1 就是普通卷积。 有效核尺寸 = F + (F − 1)(d − 1)。3×3 配 d=3 得 7×7,参数还是 9 个。 这是它和大核的根本区别:大核是「多学几个权重」,空洞是「把已有的权重摊开」。 代价是采样点稀疏,高频细节可能正好落在空洞里。 所以实践里常把不同空洞率并联起来用,这叫空洞空间金字塔。
四、三种扩大范围的办法
| 办法 | 感受野怎么变 | 参数 | 代价 |
|---|---|---|---|
| 堆层 | 每层加 k − 1 | 每层都要加 | 算力和内存 |
| 步幅 | 每层乘 s | 不变 | 丢信息 |
| 空洞 | 有效核变大 | 不变 | 采样变稀 |
这三条不互斥。实际网络三个都用:先堆层,中间插步幅降采样,后期用空洞把感受野撑回全图。
五、尺寸公式的完整版
输出 = floor((H + 2p − F)/s) + 1。 补零是加、步幅是除,两个旋钮都在这一行里。 记住它,比记任何结论都有用:形状对不上时,永远是这一行先算错。 反过来用也可以:知道想要的输出尺寸,反解出该补几圈、该用多大步幅。 这是设计网络结构时最常用的一步计算。
六、动手 Demo:步幅与空洞
输入 7×7、核 3×3、不补零。先把步幅从 1 改到 3,看输出怎么缩; 再把空洞率从 1 改到 3,看有效核怎么变大、而参数一动不动。
print("步幅 1、2、3 的输出边长:")
for s in (1, 2, 3):
print(" 步幅 %d %d" % (s, (7 - 3) // s + 1))
print("空洞率 1、2、3 的有效核与输出:")
for d in (1, 2, 3):
eff = 3 + (3 - 1) * (d - 1)
print(" 空洞 %d 有效核 %d×%d 输出 %d×%d 参数 9"
% (d, eff, eff, (7 - eff) // 1 + 1, (7 - eff) // 1 + 1))
实跑输出:
--------------------------------------------------------------------
增广范围的卷积:步幅与空洞
--------------------------------------------------------------------
输入 7×7、核 3×3、不补零,只改步幅:
步幅 输出尺寸 元素数
--------------------------------
1 5×5 25
2 3×3 9
3 2×2 4
**步幅每加 1,输出就缩一圈。**
步幅 2 相当于在卷积的同时做了一次下采样,所以它能减少后面的计算量。
另一个扩大范围的办法是空洞:核的点之间留空,参数不变,视野变大。
空洞率 有效核尺寸 输出尺寸 参数
------------------------------------------
1 3×3 5×5 9
2 5×5 3×3 9
3 7×7 1×1 9
空洞率 3 时有效核 7×7,正好盖住整张图,输出只剩 1×1。
**但参数还是 9 个——这是它和「换一个更大的核」的根本区别。**
一句话总结这一节:**感受野可以用三种办法变大——堆层、加步幅、加空洞。**
堆层加非线性,加步幅省计算,加空洞不加参数。
步幅那三行:5×5、3×3、2×2。7 − 3 等于 4,除以 s 再取整加 1。 s=3 那行要特别注意:4 除以 3 是 1.33,取整是 1,加 1 是 2。 不是 3,也不是 1。向下取整是最容易算错的一步。 空洞那三行:有效核 3、5、7,输出 5×5、3×3、1×1。参数那一列全是 9,一动不动。 d=3 时有效核 7×7 正好盖住 7×7 的输入,所以输出只剩 1×1。这就是「一个核看全图」的极端情形。 一句话收:感受野变大有三条路,加层、加速、加空。加层要算力,加速丢信息,加空只是采样变稀。
30 秒实验
- 输入 32×32、核 3×3、补 1 圈、步幅 2,输出多大?(提示:先加 2 再减 3,再除以 2)
- 空洞率 2 的 3×3 核,参数几个?有效核多大?
- 为什么说「步幅卷积比池化更灵活」?
常见误区
- 把向下取整当成四舍五入。4 除以 3 是 1.33,取整后是 1,加 1 才得 2。 除不尽时右边和下边的像素直接被丢掉,不是被平均。
- 以为步幅只是「算得快一点」。它同时改变输出尺寸和感受野,是一个结构选择,不是性能开关。
- 以为空洞卷积能替代大核。它参数少,但采样稀疏,细小图案可能正好落在空洞里。
自测三问(点开对答案)
1. 步幅 2 的 3×3 卷积在 7×7 输入上输出多大? —— 3×3。(7 − 3) / 2 + 1 = 3。注意先除后取整,再加 1。 2. 空洞率 3 的 3×3 核,有效尺寸多大? —— 7×7。公式是 F + (F − 1)(d − 1),3 加 2 乘 2 等于 7,参数还是 9 个。 3. 完整的输出尺寸公式是什么? —— floor((H + 2p − F)/s) + 1。补零在分子加,步幅在分母除,向下取整后再加一。到这里,卷积的几何部分讲完了。下面三节看卷积网络里的另外三种层:ReLU、池化、全连接。
- ☐ (本节完,下一节 5.7 卷积 ReLU 层)