Loading

数据预处理:归一化 Normalization

为什么要数据归一化Feature Scaling

  1. 由于原始数据值的范围差异很大,因此在某些机器学习算法中,如果没有归一化,目标函数将无法正常工作。例如,许多分类器通过欧几里得距离来计算两点之间的距离。如果其中一个要素的取值范围较广,则该距离将受此特定要素支配。因此,所有特征的范围应归一化,以使每个特征对最终距离的贡献大致成比例

  2. 可以使得梯度下降收敛更快

  3. 如果将正则化用作损失函数的一部分,则数据归一化也很重要(以便适当地对系数进行惩罚)

归一化的优点

  1. 提升模型的收敛速度

s

左图:归一化前 右图:归一化后
  1. 提高模型精度

常用方法

  1. 均值方差归一化 Zero-mean normalization

\[x = \frac{x-\bar{x}}{\sigma } \]

​ 又叫标准化Standardization,处理后的数据满足标准正态分布

​ 可见,归一化包含标准化,标准化只是归一化的一种

  1. Min-max normalization

\[x = \frac{x-x_{min}}{x_{max}-x_{min}} \]

​ 是一种线性的归一化方法,它的特点是不会对数据分布产生影响。

​ 当数据集的分布最大值和最小值不稳定时,结果输出可能也会不稳定。

​ 该方法在图像处理上很常用,因为大部分的图像像素值为x∈[0, 255]

  1. Non-linear normalization

    包含logexparctansigmoid等非线性函数,选择时取决于期望的输出范围:

    • log()[0,1]上有很强的区分度
    • arctan()可以将任意实数转换到[-π/2, π/2]区间
    • sigmoid()可以将任意实数映射到(0, 1)区间
  2. Length-one normalization

\[x = \frac{x}{\left | \left | x \right | \right |} \]

​ 将特征转为单位向量的形式来剔除特征强度的影响

测试集归一化

测试集归一化所用均值和标准差的必须与train dataset 的input相同,保证数据是同分布的

  • 测试集的数据分布本身是无法计算的,而深度学习神经网络的基础就是假定test settrain set是同分布的数据

target归一化

  1. input经过target下采样而来
  • 利用target下采样得到input,此时,两者本身就是同分布的(如img 1),以至于在很多SR Task中,并没有采用normalize操作

  • 若要进行normalize,两者可采用相同的均值和标准差

Snipaste_2020-12-01_23-29-30

img 1
  1. inputtarget都为Raw images
  • 当input和target都是Raw images时,两者的数据分布将会存在较大的差异,如img 2中:
    • 在R通道上,input和target的均值和标准差相差很大
    • 在G通道上,input和target的均值和标准差相差很小,接近于同分布

Snipaste_2020-12-01_23-36-56

img 2
  • 此时,对于input和target应当采用不同的均值和标准差[即img 2计算的结果],使得它们能够满足(0,1)正态分布

    def Dataset_transform_norm(imgs):
        if imgs == 'LR':
            norms = Normalize((0.1815, 0.0378, 0.0000), (0.1599, 0.0896, 1.0000)) # G通道无信息,所以标准差不能为0,因为分母不能为0
        elif imgs == 'HR_2':
            norms = Normalize((0.1290, 0.0367, 0.0000), (0.1053, 0.0830, 1.0000))
        else:
            norms = Normalize((0.1058, 0.0366, 0.0000), (0.0906, 0.0841, 1.0000))
        return Compose([
            ToTensor(),
            norms
        ])
    

    归一化后,满足正态分布,如img 3

    Snipaste_2020-12-01_23-48-30

img 3

pytorch中的归一化

pytorch中用均值标准差对张量图像进行归一化

torchvision.transforms.Normalize(mean, std, inplace=False)

所以,在数据预处理时有:

transform_train = transforms.Compose([
    transforms.ToTensor(),
    transforms.Normalize((0.4914, 0.4822, 0.4465), (0.2023, 0.1994, 0.2010)),
])

计算均值与标准差

对于RGB图像,计算均值与标准差的代码👉calculate_mean_std.py

通过对General100数据集进行计算可知

R通道 G通道 B通道
均值 0.5525 0.4983 0.4047
标准差 0.2432 0.2403 0.2482

Snipaste_2020-12-01_17-15-03

之后,便可利用计算好的均值和标准差放入到transforms.Normalize中做归一化处理了

Write by Gqq

posted @ 2020-12-01 17:19  ZHGQCN  阅读(3055)  评论(0编辑  收藏  举报