為什么要數據歸一化Feature Scaling
-
由於原始數據值的范圍差異很大,因此在某些機器學習算法中,如果沒有歸一化,目標函數將無法正常工作。例如,許多分類器通過歐幾里得距離來計算兩點之間的距離。如果其中一個要素的取值范圍較廣,則該距離將受此特定要素支配。因此,所有特征的范圍應歸一化,以使每個特征對最終距離的貢獻大致成比例
-
可以使得梯度下降收斂更快
-
如果將正則化用作損失函數的一部分,則數據歸一化也很重要(以便適當地對系數進行懲罰)
歸一化的優點
- 提升模型的收斂速度
- 提高模型精度
常用方法
- 均值方差歸一化 Zero-mean normalization
又叫標准化Standardization
,處理后的數據滿足標准正態分布
可見,歸一化包含標准化,標准化只是歸一化的一種
- Min-max normalization
是一種線性的歸一化方法,它的特點是不會對數據分布產生影響。
當數據集的分布最大值和最小值不穩定時,結果輸出可能也會不穩定。
該方法在圖像處理上很常用,因為大部分的圖像像素值為x∈[0, 255]
-
Non-linear normalization
包含
log
、exp
、arctan
、sigmoid
等非線性函數,選擇時取決於期望的輸出范圍:log()
在[0,1]
上有很強的區分度arctan()
可以將任意實數轉換到[-π/2, π/2]
區間sigmoid()
可以將任意實數映射到(0, 1)
區間
-
Length-one normalization
將特征轉為單位向量的形式來剔除特征強度的影響
測試集歸一化
測試集歸一化所用均值和標准差的必須與train dataset 的input
相同,保證數據是同分布的
- 測試集的數據分布本身是無法計算的,而深度學習神經網絡的基礎就是假定
test set
和train set
是同分布的數據
target
歸一化
input
經過target
下采樣而來
-
利用target下采樣得到input,此時,兩者本身就是同分布的(如
img 1
),以至於在很多SR Task中,並沒有采用normalize操作 -
若要進行normalize,兩者可采用相同的均值和標准差
input
和target
都為Raw images
- 當input和target都是Raw images時,兩者的數據分布將會存在較大的差異,如
img 2
中:- 在R通道上,input和target的均值和標准差相差很大
- 在G通道上,input和target的均值和標准差相差很小,接近於同分布
-
此時,對於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
:
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 |
之后,便可利用計算好的均值和標准差放入到transforms.Normalize
中做歸一化處理了
Write by
Gqq