Ch07 CNN与CV修订于 二〇二六年七月二日

7.4 CNN 的核心组件深入

把 CNN 拆开来看,每个组件都在解决一个具体问题。理解每个组件”为什么存在”,比记住它的公式重要得多。

7.4.1 卷积层(Convolutional Layer):CNN 的核心引擎

卷积层有几个关键超参数,决定了特征图的大小和感受野:

核大小(Kernel Size):最常见的是 3x3。为什么不是更大?两个 3x3 卷积堆叠,感受野等于一个 5x5 卷积(第一个 3x3 看 3x3 区域,第二个 3x3 看第一个输出的 3x3 区域,合起来覆盖了原始输入的 5x5 区域),但参数更少(2×9=18 vs 25),而且中间多了一层非线性激活。VGG 的核心理念就是”用多个小卷积核替代一个大卷积核”——更深、参数更少、非线性更多。现代 CNN(如 ConvNeXt)开始重新尝试 7x7 大卷积核,因为在大数据量下,更大的感受野一次性捕获更多上下文。

步长(Stride):卷积核每次滑动的距离。stride=1 时,输出特征图尺寸几乎不变(取决于 padding);stride=2 时,输出尺寸减半,相当于降采样。现在很多 CNN 用 stride=2 的卷积替代池化层做降采样——这叫做”全卷积”设计。

填充(Padding):在输入图片边缘补一圈零(或镜像/重复边缘像素)。“same” padding 让输出尺寸和输入相同(对于 stride=1 的 3x3 卷积,padding=1)。没有 padding(“valid”)时,每层卷积都会缩小特征图,深层网络很快就没像素了。padding 让深层网络可以堆叠很多卷积层而不会过早耗尽空间分辨率。

膨胀/空洞卷积(Dilated Convolution):在卷积核的元素之间插入空洞(间隔)。一个 dilation=2 的 3x3 卷积,实际覆盖 5x5 的区域,但只有 9 个参数。这在语义分割中非常重要——在不增加参数和不做池化(不丢失空间分辨率)的情况下扩大感受野。DeepLab 系列大量使用空洞卷积。

7.4.2 池化层(Pooling Layer):降采样与不变性

最大池化(Max Pooling):在每个 2x2 窗口中取最大值。它告诉网络”这个区域里有没有某个特征”,而不是”特征在区域的哪个位置”——这就是平移不变性的来源。最大池化对纹理和边缘响应特别有效,因为”最大值”往往对应最强的特征响应。

平均池化(Average Pooling):取窗口内所有值的平均。它更平滑,保留了背景信息。在网络的最后几层,全局平均池化(Global Average Pooling,对整个特征图取平均)常用来替代全连接层——每个特征图变成一个数字,直接送入分类器。这大大减少了参数数量(ResNet 和 GoogLeNet 都用了这个技巧)。

全局池化(Global Pooling):对整个 H×W 特征图做池化,输出一个 1×1 的值。全局平均池化把每个通道的空间信息压缩成一个标量,常用于分类网络的最后一层,替代传统的 Flatten+FC。优点是参数少、防止过拟合、允许输入任意尺寸的图片。

池化 vs 步长卷积:2026 年,步长卷积(stride=2)在很多场景下替代了池化。池化是无参数的(没有可学习的权重),步长卷积有参数,可以学习”怎么降采样最好”。但池化仍然有它的优势——计算量极小,且提供了天然的平移不变性。

7.4.3 全连接层(Fully Connected Layer):决策者

在 CNN 的最后几层,特征图被展平(Flatten)成一维向量,送入全连接层做最终的分类或回归。全连接层的作用是”综合所有特征,做出决策”——卷积层负责提取特征,全连接层负责根据这些特征判断”这是猫还是狗”。

现代趋势是用全局平均池化 + 一个全连接层替代多层全连接——参数从几百万降到几千,过拟合风险大幅降低。

7.4.4 激活函数:为什么 ReLU 在 CNN 中特别好

ReLU(Rectified Linear Unit,修正线性单元):f(x) = max(0, x)。输入大于 0 时原样输出,小于 0 时输出 0。

为什么 ReLU 在 CNN 中特别好?

  • 稀疏性:ReLU 让大约 50% 的神经元输出为 0(负值被截断)。这种稀疏性天然适合图像——一张图片中,大部分区域没有特定特征(比如一张猫的照片,大部分区域不是”猫耳朵”),让这些神经元”沉默”是合理的。
  • 梯度不消失:正数区域梯度恒为 1,不会像 Sigmoid/Tanh 那样在两端梯度趋近于 0。深层 CNN 需要梯度能一路传回第一层。
  • 计算简单:max(0, x) 比 Sigmoid 的指数运算快得多——CNN 有大量卷积操作,激活函数的计算开销不能忽略。

ReLU 的变体:Leaky ReLU(负数区域给一个很小的斜率,比如 0.01,解决”神经元死亡”问题);GELU(Gaussian Error Linear Unit,Transformer 和 ConvNeXt 中常用的平滑版 ReLU);SiLU/Swish(x * sigmoid(x),EfficientNet 使用,比 ReLU 平滑且性能略好)。

7.4.5 Dropout:随机失活

训练时,每个神经元以概率 p(通常 p=0.5)被随机”关闭”(输出置零)。这迫使网络不能依赖任何单个神经元——每个神经元都必须”独自有用”,因为它的邻居随时可能被关掉。Dropout 在 CNN 中通常只用在最后的全连接层,不在卷积层使用(卷积层有参数共享,天然抗过拟合)。BatchNorm 出现后,Dropout 的使用有所减少,因为 BatchNorm 本身也有正则化效果。

7.4.6 BatchNorm(批归一化):稳定训练的基石

BatchNorm 在每一个 mini-batch 内,对每个通道的特征图做归一化(减均值、除标准差),然后做缩放和平移(可学习的参数 γ 和 β)。位置:通常放在卷积层之后、激活函数之前(Conv → BatchNorm → ReLU)。

BatchNorm 做了什么?

  • 加速训练:归一化后每层输入的分布稳定,可以用更大的学习率,收敛更快(通常快 5-10 倍)
  • 正则化效果:每个样本的归一化依赖于同一 batch 中其他样本的统计量,引入了噪声,相当于一种正则化,减轻了对 Dropout 的依赖
  • 减少对初始化的敏感度:即使权重初始化不太理想,BatchNorm 也能把分布拉回来
  • 允许更深网络:没有 BatchNorm,训练 20+ 层的网络几乎不可能——梯度要么爆炸要么消失。BatchNorm 是 ResNet 能训练 152 层的关键基础设施之一

BatchNorm 的局限:batch size 太小时统计量不稳定(所以小 batch 场景用 LayerNorm 或 GroupNorm);训练和推理时行为不同(训练用 batch 统计量,推理用全局统计量),这是一个常见的 bug 来源。


← 上一节:7.3 池化:缩小特征图 | 下一节:7.5 经典架构 →

关联5

知识图谱

局部图谱 · 点节点跳转