池化与 CNN 基本块:从输入到特征图
池化(Pooling)在局部窗口内做汇总(取最大或平均)以缩小特征图、扩大感受野并注入小幅平移不变性;卷积 + 归一化 + 激活 + 池化循环堆叠构成 CNN 基本块,逐层把像素升级为「边缘 → 部件 → 物体」的特征层级。
一句话定义
池化(Pooling)在局部窗口内做汇总(取最大或平均)以缩小特征图、扩大感受野并注入小幅平移不变性;卷积 + 归一化 + 激活 + 池化循环堆叠构成 CNN 基本块,逐层把像素升级为「边缘 → 部件 → 物体」的特征层级。
直觉
池化像「每看一小片只记住最亮眼的一条」:细节被压缩,轮廓被保留;层层池化像「逐步缩略地图」——街区图、城区图、全国图,越看越抽象、覆盖越广。
为什么重要
CNN 不是单个卷积层而是「块的复奏曲」:kp-019 的每一代架构都是对块配方(Conv-BN-ReLU-Pool 或 Conv-BN-ReLU ×n)的重新组合。理解块的内部逻辑与特征层级的形成,才能在 kp-021 里自信地设计网络、在 kp-027 里读懂「某层特征图异常」的含义;分类头部的全局平均池化更是现代 CNN 的标准收官。
前置知识
- kp-017(卷积与感受野)、kp-006(ReLU 在块中的位置)、kp-014(BN 在块中的位置)。
核心概念
- 最大池化(max pooling):窗口内取最大值,保留最强响应,2×2、步幅 2 是经典配置。
- 平均池化(average pooling):窗口取均值,更平滑但弱化稀疏强响应。
- 全局平均池化(GAP):整张特征图取均值得到单值,替代「展平 + 大全连接」的分类头。
- 基本块(block):Conv→BN→ReLU(→Pool)的最小重复单元。
- 特征层级(feature hierarchy):低层边缘纹理、中层部件、高层整体结构的逐层抽象。
- 下采样(downsampling):缩小空间尺寸的操作统称(池化或步幅卷积)。
原理与机制
最大池化的逐窗运算:输出 = max(窗口内元素),2×2 窗、步幅 2 时特征图边长减半、通道不变。三重机制收益:空间尺寸减半使后续计算量按 4 倍缩减;感受野按层叠倍增(kp-017 公式),深层单元「见多识广」;取 max 天然容忍 1~2 像素的小平移——「猫不管往左挪一格还是猫」,这是分类任务想要的弱不变性。代价是位置细节丢失,对定位类任务(指路分割方向)需慎重或改用步幅卷积。块的组装逻辑:Conv 提特征 → BN 校准分布(kp-014)→ ReLU 注入非线性(kp-006)→ Pool 缩图扩野。深度方向的层级涌现已被可视化研究反复证实(Zeiler 与 Fergus 2014 的反卷积可视化是经典):第 1 层学到定向边缘与色块(类似生物视皮层 V1 的方向选择性),第 3~4 层出现纹理与部件(眼睛、轮子),顶层响应整体语义。分类头的现代做法是 GAP:把最后 [C,H,W] 特征图对 H、W 求均值得 C 维向量,再接一个 C×类数 的线性层——参数从「展平 7×7×512×4096」的亿级降到万级,过拟合风险骤减(kp-013 的结构性正则)。现代变体趋势:池化逐渐被 stride=2 卷积取代(下采样的同时学习如何下采样),但池化思想(局部汇总降采样)仍是所有视觉骨干网的公共基因。
公式或模型
池化尺寸变化与 GAP 输出:
池化输出: n_out = floor( (n_in − w) / s ) + 1 (2×2、s=2 时 n_out = n_in/2)
GAP: z_c = (1/(H·W)) Σ_{h,w} F(c,h,w) → 分类头: ŷ = softmax( W z ), W∈R^{类数×C}变量说明:w 为池化窗口边长,s 为步幅;F 为末端特征图。GAP 把 kp-017 的参数公式中 H·W 项整个消掉,是「用结构省参数」的典范。
图示
4×4 特征图 2×2 最大池化(s=2)→ 2×2
┌ 1 2 5 3 ┐ ┌ 6 9 ┐
│ 4 6 9 2 │ → │ 8 7 │ 每格 = 原窗口内最大值
│ 2 1 8 7 │ └─────┘
└ 0 3 4 2 ┘ 边长减半、感受野翻倍、抗小平移直观类比
特征层级像「看人群认出朋友」:第一眼只处理轮廓线条(低层),接着组合出眼镜、发型(中层部件),最后整合成「这是老王」(高层语义)——CNN 的层层块正是这条加工流水线。
实例或案例
在 kp-016 骨架上把 model 换成最小 CNN(kp-021 的前奏,MNIST 上 2 个 epoch 即 98%+):
model = nn.Sequential(
nn.Conv2d(1, 32, 3, padding=1), nn.BatchNorm2d(32), nn.ReLU(),
nn.MaxPool2d(2), # 28×28 → 14×14
nn.Conv2d(32, 64, 3, padding=1), nn.BatchNorm2d(64), nn.ReLU(),
nn.MaxPool2d(2), # 14×14 → 7×7
nn.AdaptiveAvgPool2d(1), nn.Flatten(), # GAP:64×7×7 → 64
nn.Linear(64, 10))逐行核对形状是本案例的隐藏练习:每个张量进出尺寸全部能用 kp-017/kp-018 公式预言。可视化延伸:取训练好的模型,把第一层 32 个 3×3 核画成图,会看到大量定向边缘检测器——特征层级最直观的显影。
常见误区
- 「池化层有参数要训练」:池化无参数,只有窗口与步幅两个超参(平均池化的除法不算学习)。
- 「层数越深特征图越大」:恰恰相反,好架构逐层加深通道(32→64→128)、缩小空间,计算量在层间保持平衡。
- 在小数据集上直接复刻大架构全量堆块:容量过剩 + 数据不足,先从小块配方起步(kp-021 的教训)。
- 「GAP 会丢掉空间信息所以不如展平」:分类任务不需要空间细节,GAP 换来的是大幅减参与抗过拟合。
与其他知识点的关系
本知识点把 kp-017 的卷积、kp-006 的激活、kp-014 的归一化组装成可复用单元;kp-019 的架构史就是块配方演化史;kp-021 项目用本节最小 CNN 起步;特征可视化思想与 kp-033 可解释性一脉相承。
自测题
- 2×2、步幅 2 的最大池化作用在 8×8 特征图上,输出多大?感受野变化如何?
答案要点:4×4;对前层感受野等效翻倍,且引入 2 像素内平移不变性。
- 写出 Conv-BN-ReLU-Pool 块中每个组件的一句话职责。
答案要点:Conv 局部提特征;BN 校准分布稳训练;ReLU 非线性;Pool 降采样扩感受野。
- GAP 相比「展平+大全连接」省多少参数?(末端 512×7×7、1000 类为例)
答案要点:展平方案 25088×1000≈2500 万参数,GAP 方案 512×1000≈51 万,约省 98%。
延伸阅读
- Zeiler、Fergus «Visualizing and Understanding Convolutional Networks» ECCV 2014(特征层级可视化)。
- Lin、Chen、Yan «Network in Network» 2014(GAP 出处)。
学习状态
状态保存在浏览器本地,用于首页与路径页的进度统计。