1.什么是標准化?
標准化:使數據符合 0 均值,1 為標准差的分布。
神經網絡對0附近的數據更敏感,但是隨着網絡層數的增加,特征數據會出現偏離0均值的情況,標准化能夠使數據符合0均值,1為標准差的分布,把偏移的特征數據重新拉回到0附近

BN操作使得原本偏移的特征數據,如5-11的第一個圖,重新拉回到0均值,使進入激活函數的數據分布在激活函數線性區,使得輸入數據的微小變化,更明顯的體現到激活函數的輸出,提升了激活函數對輸入數據的區分力。
但是,這種簡單的特征數據標准化,使特征數據完全滿足標准正態分布,圖5-12黃色的線,集中在激活函數中心的線性區域,使激活函數喪失了非線性特性,因此在BN操作中為每個卷積核引入了兩個可訓練的參數,縮放因子γ和偏移因子β,會與其他待訓練參數一同被訓練化,使標准正態分布后的特征數據通過縮放因子和偏移因子,優化了特征數據分布的寬窄和偏移量。保證了網絡的非線性表達力(如果不加入這兩個參數,相當於這一層所學習的特征分布被搞壞了)。

2.BN層的位置(也屬於網絡的一層,即相當於加了個預處理層)
BN 操作通常位於卷積層之后,激活層之前,在 Tensorflow 框架中,通常使用 Keras 中的 tf.keras.layers.BatchNormalization 函數來構建 BN 層。在調用此函數時,需要注意的一個參數是 training,此參數只在調用時指定,在模型進行前向推理時產生作用,當 training = True 時, BN 操作采用當前 batch 的均值和標准差;當training = False 時, BN 操作采用滑動平均(running)的均值和標准差。
在 Tensorflow 中,通常會指定 training = False,可以更好地反映模型在測試集上的真實效果。
3.滑動平均
滑動平均(running) 的解釋:滑動平均,即通過一個個 batch 歷史的疊加,最終趨向數據集整體分布的過程,在測試集上進行推理時,滑動平均的參數也就是最終保存的參數。
此外, Tensorflow 中的 BN 函數其實還有很多參數,其中比較常用的是 momentum,即動量參數, 與 sgd 優化器中的動量參數含義類似但略有區別, 具體作用為滑動平均 running =momentum * running + (1 – momentum) * batch, 一般設置一個比較大的值, 在 Tensorflow 框架中默認為 0.99。
4.tensorflow中BN的使用
1.1 tf.nn.moments
(1)計算2x3向量的mean和variance
(2)計算卷積神經網絡某層的mean和variance
假定我們需要計算的數據形狀是[batchsize, height, width, kernels]
輸出:
(3)tf.nn.batch_normalizatin
注意:
tf.control_dependencies(control_inputs)