归一化(Normalization)是指把不同尺度、范围的数据,按一定规则映射到统一、稳定的数值范围或分布,目的是让模型更稳定、更快收敛,也避免某些特征“数值大就主导训练”的问题。
一、直观理解(先有个感觉)
假设你有一张图片:
- 像素值是 0 ~ 255(uint8)
模型更喜欢这样的输入:
- 0 ~ 1
- 或 -1 ~ 1
- 或均值≈0、方差≈1
归一化就是做这件事的转换过程。
二、常见归一化类型(重点在视觉/AIPipe里)
1)最小–最大归一化(Min-Max Normalization)
公式:
x′=(x−min)/(max−min)
结果范围:通常是 [0, 1]
例子:
python pythonx = x / 255.0
2)标准归一化(Standardization / Z-score)
公式:x′=(x−μ)/σ
其中:
- μ:均值(mean)
- σ:标准差(std)
结果:
- 均值 ≈ 0
- 方差 ≈ 1
- 不一定固定在某个区间
PyTorch 里很常见:
python pythonnormalize = transforms.Normalize( mean=[0.485, 0.456, 0.406], std=[0.229, 0.224, 0.225] )这段代码到底做了什么?
假设输入 x 的形状是 (C, H, W),且已经是 [0, 1] 的 float 张量:
pythonx = (x - mean) / std
逐通道计算:
- 第 0 通道(R):
x[0] = (x[0] - 0.485) / 0.229
- 第 1 通道(G):
x[1] = (x[1] - 0.456) / 0.224
- 第 2 通道(B):
[2] = (x[2] - 0.406) / 0.225
✅ 逐通道独立归一化
✅ 不改变 H、W,只改变数值分布
为什么是这几个“奇怪的数字”?
这组 mean 和 std 来自 ImageNet 数据集的统计结果
含义是:
- 先统计整个 ImageNet 所有图片每个通道的像素均值和标准差
- 然后把这些值“定死”下来
- 以后所有用 ImageNet 预训练模型(ResNet、MobileNet、ViT 等)都必须用这一组
(ImageNet 是大规模图像数据集,而 ResNet、MobileNet、ViT 是在这个数据集上训练和验证的神经网络模型架构)