為什么要數據歸一化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
