Batch Normalization

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

1、BN的流程

傳統(tǒng)的神經(jīng)網(wǎng)絡(luò),只是在將樣本x進(jìn)入到輸入層之前對x進(jìn)行0-1標(biāo)準(zhǔn)化處理(減均值,除標(biāo)準(zhǔn)差),以降低樣本間的差異性,如下圖所示:。

BN是在此基礎(chǔ)上,不僅僅只對輸入層的輸入數(shù)據(jù)x進(jìn)行標(biāo)準(zhǔn)化,還對每個隱藏層的輸入進(jìn)行標(biāo)準(zhǔn)化,如下圖所示:

可以看到,由標(biāo)準(zhǔn)化的x得到第二層的輸入h1的時候,經(jīng)歷了如下的步驟:

1、第一層的權(quán)重項(xiàng)w 和 輸入x想成,得到s1
2、對s1進(jìn)行0-1均值方差標(biāo)準(zhǔn)化,得到s2
3、設(shè)置兩個參數(shù)γ 和 β ,計(jì)算γ * s1 + β 得到s3。注意,這里的γ 和 β是網(wǎng)絡(luò)要學(xué)習(xí)的變量。
4、將s3經(jīng)過激活函數(shù)激活之后得到h1

哎,BN的流程原來是這樣的。。早上的時候看的太快,以為就是對每一層的輸入做一個0-1標(biāo)準(zhǔn)化,再加一個γ 和 β呢。唉,得好好反思反思,明天罰自己減一個雞腿。廢話不多說,我們來看看實(shí)現(xiàn)吧。

2、tensorflow實(shí)現(xiàn)BN

tensorflow實(shí)現(xiàn)BN是很簡單的,只需要兩個函數(shù)就可以。

tf.nn.moments

該函數(shù)的樣例如下:

batch_mean, batch_var = tf.nn.moments(data, [0])

可以看到,我們輸入的第一個參數(shù)是我們的data,一定要記住,這個data是w*x之后的。第二個參數(shù)是我們要在哪一維做標(biāo)準(zhǔn)化,如果是二維數(shù)據(jù),通常每一列代表的是一個特征,因此我們一般選擇axis=[0],如果你想對所有的數(shù)據(jù)做一個標(biāo)準(zhǔn)化,那么axis=[0,1]。

tf.nn.batch_normalization

該函數(shù)的樣例如下:

tf.nn.batch_normalization(
    data,
    mean,
    variance,
    offset,
    scale,
    variance_epsilon,
    name=None
)

我們需要輸入我們的data,即w*x,然后還有剛剛用moments函數(shù)得到的均值和方差,scala和offset即前文提到的的γ 和 β ,這是兩個Variable。

完整事例
最后來看一個完整事例吧:

batch_mean, batch_var = tf.nn.moments(data, [0])
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)
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容