开发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。
- 医学影像、遥感或灰度图等特殊数据:数据分布与自然图像差异很大,更应基于实际任务检查。
- 训练和推理:必须使用同一套缩放、色彩通道和归一化配置。
统计自己的数据集
统计时应覆盖训练集中的全部像素,而不是先对每张图片求均值后再简单平均。还要固定色彩空间、通道顺序和缩放范围,并确认数据增强不会混入统计过程。
训练开始前,建议随机抽取一批样本检查:
- 通道是否为 RGB,而不是被 OpenCV 读成 BGR;
- 数值范围是否符合预期;
- 归一化后是否存在大量异常值;
- 反归一化后的图片能否正常显示;
- 训练、验证和推理是否共享同一份预处理定义。
归一化本身不会自动提高模型上限。它真正解决的是输入尺度和预训练假设的一致性,以及由此带来的训练稳定性问题。