Tensorflow學習筆記No.6
- 2020 年 10 月 9 日
- 筆記
- TensorFlow
數據的批標準化
本篇主要講述什麼是標準化,為什麼要標準化,以及如何進行標準化(添加BN層)。
1.什麼是標準化
傳統機器學習中標準化也叫做歸一化。
一般是將數據映射到指定的範圍,用於去除不同維度數據的量綱以及量綱單位(說白了就是讓數據儘可能處於某個範圍內)。
數據標準化讓機器學習模型看到的不同樣本彼此之間更加相似,這有助於模型的學習與對新數據的泛化。
常見的數據標準化形式:
標準化:
將數據減去其平均值使其中心值為0,然後將數據除以其標準差使其標準差為1。
歸一化:
將數據減去最小值除以最大時,使取值範圍壓縮到0~1之間。
批標準化:
Batch Normalization(BN),批標準化
和普通的數據標準化類似,是將分散的數據統一的一種做法,也是優化神經網路的一種方法。
不僅在數據輸入之前對數據做標準化,在網路模型的每一次變換之後都應該考慮數據的標準化。
即使在訓練過程中,均值和方差隨著時間發生變化,它也可以適應性的將數據標準化。
2.為什麼要做批標準化
批標準化解決的問題是梯度消失與梯度爆炸。
批標準化是一種訓練優化方法。
梯度消失與梯度爆炸:
對於激活函數,之前一直使用Sigmoid函數,其函數影像成一個S型,如下所示,它會使得輸出在[0, 1]之間:

批標準化的好處:
數據預處理可以加速收斂,同理,在神經網路中使用批標準化也可以加速收斂,而且還有更多的優點。
1.具有正則化的效果(抑制過擬合)。
2.提高模型泛化能力。
3.允許更高的學習率從而加速收斂。
4.批標準化有助於梯度的傳播,因此能夠使用更深的網路進行訓練。對於特別深的神經網路,只有包含多個Batch Normalization(BN)層才能進行訓練。
3.tensorflow實現批標準化
Batch Normalization通常在卷積層或者全連接層之後使用(原始論文中一般是應用於卷積層或全連接層之後,在激活函數之前。但是,實際上放在激活函數之後效果可能更好)。
使用tf.keras.layers.Batchnormalization()來實現。
tf.keras.layers.Batchnormalization()不僅可以處理訓練數據的均值和方差,也可以在預測時,根據訓練數據均值和方差的期望值對測試數據進行處理。
程式碼:
1 model.add(tf.keras.layers.Conv2D(64, (3, 3))) 2 model.add(tf.keras.layers.BatchNormalization()) 3 model.add(tf.keras.layers.Activation('relu')) 4 #兩種BN層插入方式 5 model.add(tf.keras.layers.Conv2D(64, (3, 3), activation = 'relu')) 6 model.add(tf.keras.layers.BatchNormalization())