跳到主要内容

卷积层的配件 — 尺寸公式、通道、1×1 卷积与池化

这一章讲五件配件: padding(补边)、stride(跳步)、通道(彩色与多套图案)、 1×1 卷积(只混通道)、池化(无参数缩图)。 第 06 章回答了「卷积为什么非如此不可」;这一章回答「搭一个真的卷积网络时, 每个旋钮拧下去会发生什么」。所有旋钮的效果都带原书实测数字。

1. 先看现象:图像越卷越小,边界最先糊

一个卷积核「骑」在图像上滑动,图像边缘的像素永远凑不齐一个完整窗口—— 每卷一次,图就缩小一圈(第 06 章的 n−k+1),而且边缘像素参与的窗口数远少于中心像素, 边缘信息先天吃亏(原书叫 border effect,边界效应)1

网络又是叠层的(第 06 章:深度换视野):每层缩一圈,十层下去图就没了。 两个配件为此而生,一个管「别缩小」,一个管「主动缩小」。

2. 尺寸公式:padding 与 stride

padding:往边上补零,换来「尺寸不变」

padding(填充)在图像四周补一圈 0(最常用的是零填充),让边缘像素也能凑满窗口2。 原书给的通用公式,一次管齐:

输出尺寸(每边)= ⌊(n + 2p − k) / s⌋ + 1

n=输入边长 p=每侧补几圈 k=核边长 s=步长
图说:全书后面所有尺寸问题都拿它算,不用背,用时推导。

经验法则:p = k − 1 时输出与输入同尺寸;此时若 k 是奇数,上下各补 (k−1)/2 圈、 天然对称——这就是卷积核惯用 1、3、5、7 这类奇数尺寸的原因:补得对称, 每个输出元素的计算窗口正好以自己为中心,网络各层尺寸好推算3

原书实测: 核 3×3、padding=1,输入 8×8,输出还是 8×84。 代价也要知道:补进来的 0 是假像素,越靠边的输出值越「掺水」—— 所以 p 通常只补到保尺寸为止,不多补。

stride:不想保尺寸,就跳着走

stride(步长)是核每次滑几格。默认 1;改成 2 就是每两格采样(跳着取点)一次——主动缩小。 原书实测:核 3、stride 2,输入 8×8 → 输出 4×4,长宽各半5。 动机两条:省计算(跳过的位置不算)、以及有意降采样(把空间细节让位给通道数, 这是后面 ResNet 一类架构的标准操作,原书没讲,这里立个牌子)。

3. 通道:卷积核也是「三维」的

第 06 章的核是 2×2 的平面。真彩色图像进来,每个像素有红绿蓝三个数—— 核必须跟着加一层「输入通道」维,否则没东西可卷6

多输入通道:各卷各的,最后加总

规则:每个输入通道配一张同尺寸的核,各卷各的,结果逐元素相加成一个输出通道7。 原书的图 4.8 给了一个两通道手算,值得整段搬下来:

通道 1 的 2×2 块与它的核: 1×1 + 2×2 + 4×3 + 5×4 = 37
通道 2 的 2×2 块与它的核: 0×0 + 1×1 + 3×2 + 4×3 = 19
合计输出: 37 + 19 = 56

图说:两个通道(比如红和绿)各自的「相似度打分」相加——
任何一条通道单独强,都能把总分抬起来。

多输出通道:一个核一套图案,多核多套图案

反过来想要多个输出通道(第 06 章说过:一个核只认一种图案),就给每个输出通道配 一整套(输入通道数 × 核高 × 核宽)的核。原书补了一个重要的实践事实: 网络越深,通道数越多——通道在这里接班了第 06 章「深度换视野」的下一棒: 空间尺寸越缩越小,通道数越来越多,信息从「哪里有」转存到「是什么」8

1×1 卷积:不看空间、只混通道的特例

核缩到 1×1,空间维度上什么都不看,唯一做的事是在每个像素位置上,把各通道的值 线性组合成新值。原书给它一个精准的定位:等价于在每个像素上放一个全连接层, 参数量只有 输出通道数 × 输入通道数(再加偏置)9。 用途:降维(把几百个通道压到几十个,后面层的计算量跟着降)、升维、通道间信息融合; GoogLeNet、ResNet、MobileNet 都在用它10。 注意它本身是线性的,非线性仍来自紧随其后的激活函数(第 04 章的老规矩)11

4. 池化:无参数的缩图器

解决什么问题: 卷积层有核要训练,「缩小图」这件粗活却不必动用可训练参数。 池化(pooling)用一个固定窗口滑动,每个窗口只留一个数12:

输入: 2×2 最大池化输出: 2×2 平均池化输出:
0 1 2 4 5 2 3
3 4 5 7 8 5 6
6 7 8

图说:max 取窗口最大值(左上窗口 max(0,1,3,4)=4,原书图 4.10),
avg 取平均值。原书实测:同一输入,max 出 [[4,5],[7,8]],avg 出 [[2,3],[5,6]]。
池化层没有任何可训练参数,核也不用翻转,就是逐窗口的固定运算。

max 和 avg 的分工: max 保留「这个区域里最强的响应」——图案在不在,一眼可辨; avg 平滑整块——要的是区域整体的量感。特征检测用 max 多,原书两句话点清13

池化买的真正保险:平移容忍。 原书有一个精彩的论证:卷积核输出「有图案」的强响应后, 图案挪动一格,响应也挪一格;而 2×2 最大池化的窗口里,只要那个强响应还在窗口里, 输出就一模一样——用书里的符号,无论 a、b、e、f 具体是多少,Y 里就是 max(a,b,e,f)。 挪一格以内的图案,输出纹丝不动14

于是 CNN 的「平移不变」分两段完工:卷积层给平移等价(图案挪,响应跟着挪), 池化层把「挪一格」吸收掉,给平移不变(响应不再动)。前者来自权重共享, 后者来自窗口取最大——两条先验各出一半力15

5. 作者的判断与证据

  • 可复算的实测: padding 例(3/1 → 8×8 进 8×8 出)、stride 例(3/2 → 8×8 进 4×4 出)、 双通道 37+19=56、池化两连([[4,5],[7,8]] 与 [[2,3],[5,6]])——本章四个数字全部来自 书中代码的真实输出,可逐一回核16
  • 代码 bug 一处: 4.5.1 的验证代码调用了 cross_correlation_multi_channel(X, K), 而上面定义的函数名是 cross_correlation——照抄会直接 NameError17
  • 底色与第 06 章相同: 本章同样出自 d2l.ai 的改写(尺寸公式、37+19、池化示例 全部与 d2l 卷积章同构),出处纪律问题已在第 06 章 §5 记档,不再重复展开18
  • 只有断言的: 「通道数越深越多」「池化帮助泛化」等句无实验支撑,当设计常识记。

判断(我们的,不是书里的): 本章五个配件其实是同一条原则的五种用法: 把「空间分辨率」当成可以花的预算——padding 是「花假币保尺寸」, stride 和池化是「主动削减空间、把预算转存到通道」, 1×1 卷积是「不动空间、重组通道」。 看懂这条,读任何现代 CNN 的结构表(空间缩一半、通道翻一倍的那种)都不再需要背。 如果错,会错在: 如果某个架构反其道而行(如高分辨率小模型流派,空间一直不缩), 这条「预算转移」的说法就只是主流做法的归纳而非铁律——它描述惯例,不约束设计。

6. 边界与局限

  • 池化的地位变化原书没讲: 补充(不在书里,来自通用知识):近年不少架构用带 stride 的卷积替代池化 (让「缩小」也可学习),原书不知此事,读者在别的材料见到「无池化 CNN」不必惊讶。
  • 原书没讲: 「same/valid padding」这套框架术语、空洞卷积、以及池化对 感受野增速的影响(池化也能放大感受野,这是第 06 章感受野的延伸)。
  • 数字的适用边界: 池化「挪一格纹丝不动」的论证依赖「窗口 2×2、步长 2」的经典配置; 窗口更大、步长更长的配置里,容忍范围跟着窗口几何变。

7. 可带走的

  1. 尺寸万能公式:每边输出 = ⌊(n + 2p − k)/s⌋ + 1,用时推导,不必背;
  2. p = k−1 保尺寸;奇数核补得对称——卷积核惯用 1/3/5/7 的原因;
  3. stride 是「主动缩小」:核 3、stride 2,8×8 → 4×4;
  4. 多输入通道:各通道各卷各的、结果相加(37+19=56);多输出通道:一核一图案;
  5. 网络越深:空间越小、通道越多——信息从「哪里」转存到「是什么」;
  6. 1×1 卷积 = 每个像素上放一个全连接层,只混通道不看空间,专职降维升维;
  7. 池化无可训练参数;max 留最强响应,avg 平滑量感(max(0,1,3,4)=4);
  8. 平移不变分两段:卷积给「跟着挪」(等价),池化给「挪了也不变」(容忍);
  9. 空间分辨率是预算:padding/stride/池化/1×1 都在「花」它——看懂这条就能读结构表。

8. 原文地图

主题原书章原文位置
边界效应4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1147(搜「border effect」)
padding 补零保尺寸4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1125(搜「Padding」) · text/41-ch04-4-convolutional-neural-networks.txt:1129(搜「zero-padding」)
尺寸公式4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1198(搜「Output height」)
p=k−1 与奇数核4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1219(搜「common practice」) · text/41-ch04-4-convolutional-neural-networks.txt:1253(搜「odd kernel sizes」)
8×8 进 8×8 出4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1289(搜「Output height: 8」)
stride 定义与两动机4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1297(搜「Stride」) · text/41-ch04-4-convolutional-neural-networks.txt:1307(搜「Computational Efficiency」)
带 stride 公式4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1360(搜「stride for the height」)
8×8 进 4×4 出4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1409(搜「(1, 1, 4, 4)」)
通道三维化4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1412(搜「Multiple Input」) · text/41-ch04-4-convolutional-neural-networks.txt:1432(搜「3」)
多输入通道规则4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1419(搜「Multiple Input Channels」) · text/41-ch04-4-convolutional-neural-networks.txt:1492(搜「added together」)
37+19=56 走查4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1503(搜「1, 2, 4」) · text/41-ch04-4-convolutional-neural-networks.txt:1515(搜「56」)
越深通道越多4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1591(搜「increase the channel」)
多输出通道4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1590(搜「Multiple Output Channels」) · text/41-ch04-4-convolutional-neural-networks.txt:1606(搜「separate kernel」)
1×1 卷积定位4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1681(搜「1」) · text/41-ch04-4-convolutional-neural-networks.txt:1722(搜「fully connected layer」)
1×1 用途与名架构4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1690(搜「Dimensionality Reduction」) · text/41-ch04-4-convolutional-neural-networks.txt:1714(搜「GoogLeNet」)
1×1 后接非线性4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1697(搜「nonlinear activation」)
池化动机4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1793(搜「Pooling」) · text/41-ch04-4-convolutional-neural-networks.txt:1847(搜「Location Invariance」)
池化无参数4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1861(搜「Maximum Pooling」) · text/41-ch04-4-convolutional-neural-networks.txt:1864(搜「do not have any parameters」)
max(0,1,3,4)=44 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1835(搜「Max-pooling」) · text/41-ch04-4-convolutional-neural-networks.txt:1837(搜「max(0, 1, 3, 4)」)
池化实测输出4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1985(搜「4., 5.」) · text/41-ch04-4-convolutional-neural-networks.txt:2000(搜「2., 3.」)
挪一格输出不变4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1916(搜「no more than one」) · text/41-ch04-4-convolutional-neural-networks.txt:1927(搜「max(a, b, e, f)」)
函数名不一致 bug4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1575(搜「cross_correlation_multi_channel」) · text/41-ch04-4-convolutional-neural-networks.txt:1526(搜「def cross_correlation」)
感受野随层扩大4 Convolutional Neural Networkstext/41-ch04-4-convolutional-neural-networks.txt:1794(搜「receptive field」)

Footnotes

  1. 出处:「4 Convolutional Neural Networks」第 1147 段(text/41-ch04-4-convolutional-neural-networks.txt:1147,搜「border effect」)。原文:大核卷积会丢失图像周边像素的信息,通称 border effect/boundary distortion。

  2. 出处:「4 Convolutional Neural Networks」第 1125 段(搜「Padding」)与第 1129 段(搜「zero-padding」)。原文:在边界补像素(常为零)让核能完整应用于所有像素。

  3. 出处:「4 Convolutional Neural Networks」第 1219 段(搜「common practice」)与第 1253 段(搜「odd kernel sizes」)。原文:p=k−1 保持输入输出同尺寸;k 为奇数时两侧各补一半,填充对称、窗口居中,「便于推断每层输出形状」。

  4. 出处:「4 Convolutional Neural Networks」第 1289 段(text/41-ch04-4-convolutional-neural-networks.txt:1289,搜「Output height: 8」)。代码:kernel_size=3、padding=1,输入 8×8,输出高宽均 8。

  5. 出处:「4 Convolutional Neural Networks」第 1360 段(搜「stride for the height」)(公式)与第 1409 段(text/41-ch04-4-convolutional-neural-networks.txt:1409,搜「(1, 1, 4, 4)」)。代码:kernel_size=3、stride=2,8×8 输入输出 (1,1,4,4)。

  6. 出处:「4 Convolutional Neural Networks」第 1432 段(text/41-ch04-4-convolutional-neural-networks.txt:1432,搜「3」)。原文:RGB 图每个像素三个值,核也要带通道维。

  7. 出处:「4 Convolutional Neural Networks」第 1455 段(搜「Multiple Input Channels」)与第 1492 段(搜「added together」)。原文:每个通道独立做互相关,结果跨通道相加成一个输出通道。

  8. 出处:「4 Convolutional Neural Networks」第 1503-1515 段(text/41-ch04-4-convolutional-neural-networks.txt:1503,搜「1, 2, 4」;:1515,搜「56」)。图 4.8 的两通道手算:37 与 19,合计 56。「越深通道越多」在第 1591 段(搜「increase the channel」):通道维随深度增加,以学习更复杂的抽象特征。

  9. 出处:「4 Convolutional Neural Networks」第 1722 段(text/41-ch04-4-convolutional-neural-networks.txt:1722,搜「fully connected layer」)。原文:1×1 卷积等价于在每个像素位置独立应用的全连接层,只需 co×ci 个权重(加偏置)。

  10. 出处:「4 Convolutional Neural Networks」第 1690 段(搜「Dimensionality Reduction」)与第 1713 段(搜「GoogLeNet」)。四个用途:降维、非线性(配合激活)、信息融合、网络效率;GoogLeNet/ResNet/MobileNet 均在用。

  11. 出处:「4 Convolutional Neural Networks」第 1697 段(text/41-ch04-4-convolutional-neural-networks.txt:1697,搜「nonlinear activation」)。原文:1×1 卷积不能被折叠合并,因为其后的非线性激活不可省。

  12. 出处:「4 Convolutional Neural Networks」第 1861 段(搜「Maximum Pooling」)与第 1864 段(搜「do not have any parameters」)。原文:池化窗口固定滑动,没有可学习参数,只做最大或平均。

  13. 出处:「4 Convolutional Neural Networks」第 1869 段(搜「Max-Pooling (Max-Pool)」)与第 1874 段(搜「Average Pooling」)。原文:max 捕捉局部最强响应、利于特征检测;avg 给出更平滑的表示。

  14. 出处:「4 Convolutional Neural Networks」第 1915 段(搜「no more than one」)、第 1927 段(text/41-ch04-4-convolutional-neural-networks.txt:1927,搜「max(a, b, e, f)」)与第 1933 段(搜「always have a value of 1」)。原文:图案在高度或宽度上挪动不超过一个元素时,池化输出不变。

  15. 出处:「4 Convolutional Neural Networks」第 1815 段(搜「Invariance to translation」)与第 1835 段(搜「Max-pooling」)。卷积的权重共享给平移等价、池化给局部平移不变——原书在 4.6 开头与 4.6.1 分两处讲。

  16. 出处:同 §2-§4 各脚注:第 1289 段、第 1409 段、第 1515 段、第 1985 段(text/41-ch04-4-convolutional-neural-networks.txt:1985,搜「4., 5.」)、第 2000 段(搜「2., 3.」)。

  17. 出处:「4 Convolutional Neural Networks」第 1575 段(text/41-ch04-4-convolutional-neural-networks.txt:1575,搜「cross_correlation_multi_channel」)与第 1526 段(搜「def cross_correlation」)。调用名与定义名不一致,照抄抛 NameError。

  18. 出处:「4 Convolutional Neural Networks」第 630 段(text/41-ch04-4-convolutional-neural-networks.txt:630,搜「d2l」)。d2l 底色与出处缺失的完整分析见 07-birth-of-convolution 的说法——即本组拆解第 06 章 §5(文件 06-birth-of-convolution.md)。