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

7.8 CNN 的训练技巧

训练一个高性能 CNN 不只是搭好架构——训练技巧同样重要,有时甚至比架构更重要。2026 年的最佳实践包括:

7.8.1 数据增强(Data Augmentation):凭空创造数据

CNN 需要大量数据才能泛化,但标注数据很贵。数据增强在训练时”凭空”创造更多训练样本。

基础增强:

  • 随机翻转(Random Flip):水平翻转(镜像)。猫的镜像还是猫,但 CNN 学到了”猫不一定要朝左”。垂直翻转要小心——把”天空在上、地面在下”翻转后就乱了。
  • 随机旋转(Random Rotation):±10-30 度的小角度旋转。更大角度可能导致物体变形失真。
  • 随机裁剪(Random Crop):从原图中随机裁剪一块区域,然后放大到固定尺寸。这让 CNN 学会了”物体可能不完整”——即使只看到猫的头,也要能判断是猫。
  • 颜色抖动(Color Jitter):随机改变亮度、对比度、饱和度、色调。让 CNN 不依赖特定颜色——“白天拍的猫和黄昏拍的猫都是猫”。

高级增强:

  • Mixup:把两张图片按一定比例混合(像素和标签都混合)。例如 70% 的猫图 + 30% 的狗图,标签是 70% 猫 + 30% 狗。这迫使 CNN 学习”软边界”——不是非黑即白的分类,而是概率分布。Mixup 对防止过拟合和提升对抗鲁棒性非常有效。
  • CutMix:从一张图中切一块区域,粘贴到另一张图的随机位置,标签按面积比例混合。比 Mixup 更”自然”——生成的图片看起来更真实(不是半透明的叠加)。CutMix 特别适合目标检测和定位任务。
  • RandAugment:自动搜索最优的增强策略(组合哪些增强、强度多大),免除人工调参。
  • AutoAugment:用强化学习搜索最优增强策略。虽然效果好,但搜索过程计算量大。

数据增强的核心原则:增强后的图片在”人眼看来应该还能识别”——如果人看不出来是什么,CNN 也很难学到有用的东西。

7.8.2 迁移学习(Transfer Learning):站在巨人的肩膀上

从零训练一个 CNN 需要百万级标注数据和数周 GPU 时间。迁移学习让你用几千张图片、几小时就能训练出不错的模型。

ImageNet 预训练:下载一个在 ImageNet(120 万张图,1000 类)上预训练好的模型(如 ResNet-50),它的卷积层已经学会了提取通用视觉特征(边缘、纹理、形状、部件)。你只需要:

  • 冻结(Freeze):锁定预训练的卷积层权重,只训练最后的分类层(全连接层)。适合你的数据很少(<1000 张)且和 ImageNet 类似。
  • 微调(Fine-tune):用很小的学习率(通常是原来学习率的 1/10)更新所有层的权重。适合你的数据较多(几千张)或和 ImageNet 差异较大(如医学影像、卫星图)。

为什么 ImageNet 预训练有效:ImageNet 包含 1000 类日常物体,模型学到的前几层特征(边缘检测器、颜色检测器)几乎是所有视觉任务通用的。即使是医学影像这种和 ImageNet 完全不同的领域,ImageNet 预训练也比随机初始化好——因为底层的边缘和纹理检测仍然是通用的。

2026 年的趋势:自监督预训练(如 DINOv2、MAE)正在部分取代 ImageNet 监督预训练。自监督方法不需要标注,可以在任意大量无标注图片上预训练,效果通常更好。

7.8.3 学习率调度(Learning Rate Scheduling)

学习率不是一成不变的——训练的不同阶段需要不同的学习率。

  • 阶梯下降(Step Decay):每隔 N 个 epoch 学习率乘以 0.1(如每 30 epoch 降 10 倍)。简单粗暴,但有效。
  • 余弦退火(Cosine Annealing):学习率按余弦曲线从初始值平滑降到接近零。比阶梯下降更平滑,通常效果更好。
  • 预热(Warmup):训练最开始几个 epoch,学习率从极小值线性增加到目标值。防止训练初期梯度不稳定导致模型”跑偏”。ResNet 和 Transformer 都需要 warmup。
  • OneCycleLR:学习率先升后降(像一座山),配合动量先降后升。在一个周期内快速收敛,适合预算有限时快速实验。

7.8.4 批归一化(BatchNorm)的最佳实践

BatchNorm 是 CNN 训练的标配,但有几个细节要注意:

  • 训练和推理不一致:训练时用 batch 内的均值和方差,推理时用训练过程中积累的全局均值和方差。忘记切换模式(model.eval())是一个经典 bug。
  • Batch Size 影响:batch size 太小(<8)时,batch 统计量不稳定,BatchNorm 效果变差。解决方案:使用 GroupNorm 或 LayerNorm 替代,或使用同步 BatchNorm(多 GPU 间同步统计量)。
  • 冻结 BatchNorm:微调时,如果数据量很少,建议冻结 BatchNorm 层(使用预训练的统计量),不要用新数据重新估计。

7.8.5 标签平滑(Label Smoothing)

标准分类任务中,正确类别的标签是 1,其他类别是 0。这鼓励模型对预测”过度自信”——把 100% 概率押在正确类别上。标签平滑把标签从 [0, 0, 1, 0, 0] 变成 [0.025, 0.025, 0.9, 0.025, 0.025]——正确类别是 0.9,其他类别平分 0.1。这让模型更”谦虚”,泛化更好,尤其在对抗攻击下更鲁棒。

7.8.6 2026 年 CNN 训练的推荐配置

场景推荐策略说明
数据量 < 1000冻结预训练模型 + 只训练分类头防止过拟合,几分钟就能训练完
数据量 1000-10000微调预训练模型 + 强数据增强用 Mixup/CutMix,小学习率
数据量 > 10000 + 与 ImageNet 差异大微调 + RandAugment + 余弦退火可以放开更多层训练
从零训练(有百万级数据)完整训练 + 所有增强技巧参考 ConvNeXt 的训练策略
移动端部署知识蒸馏:用大模型教小模型让 MobileNet 达到 ResNet 的精度

← 上一节:7.6 经典 CNN 架构详解:从 1998 到 2022 的创新之路 | 下一节:7.9 目标检测 — 从 R-CNN 到 YOLO →

关联5

知识图谱

局部图谱 · 点节点跳转