今兒調模型大佬又給支了一招,叫Batch Normalization(下面簡稱BN),雖然還沒有深刻了解這玩意是什麼,但是是真的挺有效的,哈哈。是以本文隻是總結一下BN的具體操作流程以及如何用tensorflow來實作BN,對于BN更深層次的了解,為什麼要BN,BN是否真的有效大家可以參考知乎上的回答:https://www.zhihu.com/question/38102762
1、BN的流程
傳統的神經網絡,隻是在将樣本x進入到輸入層之前對x進行0-1标準化處理(減均值,除标準差),以降低樣本間的差異性,如下圖所示:
BN是在此基礎上,不僅僅隻對輸入層的輸入資料x進行标準化,還對每個隐藏層的輸入進行标準化,如下圖所示:可以看到,由标準化的x得到第二層的輸入h1的時候,經曆了如下的步驟:
1、第一層的權重項w 和 輸入x想成,得到s1
2、對s1進行0-1均值方差标準化,得到s2
3、設定兩個參數γ 和 β ,計算γ * s1 + β 得到s3。注意,這裡的γ 和 β是網絡要學習的變量。
4、将s3經過激活函數激活之後得到h1
哎,BN的流程原來是這樣的。。早上的時候看的太快,以為就是對每一層的輸入做一個0-1标準化,再加一個γ 和 β呢。唉,得好好反思反思,明天罰自己減一個雞腿。廢話不多說,我們來看看實作吧。
2、tensorflow實作BN
tensorflow實作BN是很簡單的,隻需要兩個函數就可以。
tf.nn.moments
該函數的樣例如下:
batch_mean, batch_var = tf.nn.moments(data, [0])
可以看到,我們輸入的第一個參數是我們的data,一定要記住,這個data是w*x之後的。第二個參數是我們要在哪一維做标準化,如果是二維資料,通常每一列代表的是一個特征,是以我們一般選擇axis=[0],如果你想對所有的資料做一個标準化,那麼axis=[0,1]。
tf.nn.batch_normalization
tf.nn.batch_normalization(
data,
mean,
variance,
offset,
scale,
variance_epsilon,
name=None
)
我們需要輸入我們的data,即w*x,然後還有剛剛用moments函數得到的均值和方差,scala和offset即前文提到的的γ 和 β ,這是兩個Variable。
完整執行個體
最後來看一個完整執行個體吧:
scale2 = tf.Variable(tf.ones([units]))
beta2 = tf.Variable(tf.zeros([units]))
data = tf.nn.batch_normalization(data, batch_mean, batch_var, beta2, scale2,variance_epsilon=1e-3)
參考資料:https://blog.csdn.net/whitesilence/article/details/75667002
原文釋出時間為:2018-08-22
本文作者:文文
本文來自雲栖社群合作夥伴“
Python愛好者社群”,了解相關資訊可以關注“
”。