天天看點

模型調優沒效果? 不妨試試Batch Normalization!

今兒調模型大佬又給支了一招,叫Batch Normalization(下面簡稱BN),雖然還沒有深刻了解這玩意是什麼,但是是真的挺有效的,哈哈。是以本文隻是總結一下BN的具體操作流程以及如何用tensorflow來實作BN,對于BN更深層次的了解,為什麼要BN,BN是否真的有效大家可以參考知乎上的回答:https://www.zhihu.com/question/38102762

1、BN的流程

傳統的神經網絡,隻是在将樣本x進入到輸入層之前對x進行0-1标準化處理(減均值,除标準差),以降低樣本間的差異性,如下圖所示:

模型調優沒效果? 不妨試試Batch Normalization!
BN是在此基礎上,不僅僅隻對輸入層的輸入資料x進行标準化,還對每個隐藏層的輸入進行标準化,如下圖所示:
模型調優沒效果? 不妨試試Batch Normalization!

可以看到,由标準化的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愛好者社群

”,了解相關資訊可以關注“

”。