回到笔记
开发AI

图像模型训练:归一化与数据检查

从 ImageNet 的通道统计出发,说明何时沿用预训练参数、何时统计自己的数据集,以及训练前应该检查什么。

图像模型训练里经常出现两组数字:

mean = [0.485, 0.456, 0.406]
std = [0.229, 0.224, 0.225]

它们不是经验参数,而是 ImageNet 训练集在 RGB 三个通道上的统计量。使用基于 ImageNet 预训练的模型时,输入通常也要采用同一套预处理,避免训练和推理阶段的数据分布不一致。

归一化做了什么

对某个通道中的像素 (x),标准化后的值为:

[ x' = \frac{x - \mu}{\sigma} ]

其中 (\mu) 是通道均值,(\sigma) 是通道标准差。这个过程把不同通道放到更接近的尺度上,通常有助于优化过程保持稳定。

在 PyTorch 中可以直接写:

from torchvision import transforms

normalize = transforms.Normalize(
    mean=[0.485, 0.456, 0.406],
    std=[0.229, 0.224, 0.225],
)

[!IMPORTANT] Normalize 期望输入已经转换到 [0, 1]。如果仍是 [0, 255] 的整数像素,统计量和输入尺度并不匹配。

什么时候不该照搬 ImageNet 参数

  • 使用 ImageNet 预训练权重:优先沿用该模型声明的预处理方式。
  • 从头训练模型:可以统计自己的训练集,而不是机械套用 ImageNet。
  • 医学影像、遥感或灰度图等特殊数据:数据分布与自然图像差异很大,更应基于实际任务检查。
  • 训练和推理:必须使用同一套缩放、色彩通道和归一化配置。

统计自己的数据集

统计时应覆盖训练集中的全部像素,而不是先对每张图片求均值后再简单平均。还要固定色彩空间、通道顺序和缩放范围,并确认数据增强不会混入统计过程。

训练开始前,建议随机抽取一批样本检查:

  1. 通道是否为 RGB,而不是被 OpenCV 读成 BGR;
  2. 数值范围是否符合预期;
  3. 归一化后是否存在大量异常值;
  4. 反归一化后的图片能否正常显示;
  5. 训练、验证和推理是否共享同一份预处理定义。

归一化本身不会自动提高模型上限。它真正解决的是输入尺度和预训练假设的一致性,以及由此带来的训练稳定性问题。