數據預處理:歸一化 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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM