TensorFlow實(shí)現(xiàn)‘批標(biāo)準(zhǔn)歸一化’詳解

卷首語(yǔ):

首先,筆者在這里祝大家新年快樂(lè)?。?!今天我們來(lái)探討的問(wèn)題是BN層在TensorFlow中的實(shí)現(xiàn),以實(shí)踐為主,理論方面會(huì)跳過(guò)一些不易被理解的部分,讓大家可以快速搭建并投入使用。

在文章的最后我也會(huì)給出相應(yīng)的效果對(duì)比,猶豫要不要學(xué)習(xí)的讀者可以先看看最后在做決定~

在訓(xùn)練模型時(shí),我們經(jīng)常會(huì)在一些需要調(diào)整的參數(shù)上浪費(fèi)時(shí)間:學(xué)習(xí)率,學(xué)習(xí)衰減率,正則……

況且即便我們調(diào)整了很多次參數(shù),也未必見(jiàn)得可以提高模型的訓(xùn)練效果,甚至還有可能產(chǎn)生梯度消失等等一系列令人頭疼的問(wèn)題。

但是,這種現(xiàn)象在Inception-v2中就已經(jīng)發(fā)生了改變。在Inception模型升級(jí)時(shí)引入了一種新的網(wǎng)絡(luò)層“Batch Normalization”

比較官方的公式,不懂的讀者可以直接忽略

為了降低學(xué)習(xí)難度,筆者在這里給出一個(gè)精簡(jiǎn)的公式

BN公式

下面,讓我們對(duì)公式逐一地進(jìn)行分解(注:有微積分基礎(chǔ)的讀者想必就不用我多說(shuō)了,可以跳過(guò)理論這段)

均值與方差

均值(mean):

首先,讓我們假設(shè)一數(shù)組:X = [1,2,3,4,5]

mean = 數(shù)組和/數(shù)量

mean = (1+2+3+4+5)/5

mean = 3

方差(variance):

讓我們繼續(xù)使用上一數(shù)組X

variance = (X12+ X22++ Xn2)/ n

variance = (12+ 22 + 32 + 42 + 52)/ 5

variance = (1 + 4 + 9 + 1 6 + 2 5 )/ 5

variance =? 45 / 5

variance =? 9

在TensorFlow中,該公式內(nèi)的“均值”與“方差”可通過(guò)tf.nn.moments()函數(shù)來(lái)計(jì)算

內(nèi)部參數(shù)

x:輸入進(jìn)行計(jì)算的張量

axes:需要計(jì)算的維度

name:命名

keep_dims:是否保持維度

TensorFlow實(shí)現(xiàn)

縮放與偏移

在公式中,我們可以將“縮放”與“偏移”理解為兩組可被訓(xùn)練的Weights

縮放(scale):

在定義scale時(shí)一般初始化為0,維度必須和mean的一致

TensorFlow實(shí)現(xiàn)

偏移(offset):

定義offset的情況和scale基本一致,但要注意的是offset一般情況下初始化為1

TensorFlow實(shí)現(xiàn)

按照上面所講的,公式中的內(nèi)容我們已經(jīng)解析完全,接下來(lái)我們只需要套用一個(gè)現(xiàn)成的函數(shù):

TensorFlow實(shí)現(xiàn)

神來(lái)一筆:Variance_epsilon

在上面的函數(shù)中,我們將“輸入”“均值”“方差”“偏移”“縮放”都添加了進(jìn)去,最后還有個(gè)參數(shù):variance_epsilon = 0.001

這個(gè)參數(shù)的作用在官方解釋為:A small float number to avoid dividing by 0.

大概的意思就是需設(shè)定一個(gè)浮點(diǎn)數(shù)用來(lái)避免除以0產(chǎn)生的梯度爆炸

雖然在方差被除等于零是幾率很小的事,可在幾十層甚至幾百層的神經(jīng)網(wǎng)絡(luò)里,計(jì)算量也要大的驚人,根據(jù)墨菲定律:會(huì)出錯(cuò)的事總會(huì)出錯(cuò)

滑動(dòng)平均與滑動(dòng)方差

注:BN層在訓(xùn)練與測(cè)試時(shí)所用的滑動(dòng)平均和滑動(dòng)方差不同

申請(qǐng)滑動(dòng)平均與滑動(dòng)方差(這里就應(yīng)該不用我多敘述了,純基礎(chǔ)范圍,不太理解的可以去找一下關(guān)于滑動(dòng)平均的博文):

TensorFlow實(shí)現(xiàn)

計(jì)算滑動(dòng)平均與滑動(dòng)方差:

TensorFlow實(shí)現(xiàn)

存儲(chǔ)優(yōu)化參數(shù):

TensorFlow實(shí)現(xiàn)
TensorFlow實(shí)現(xiàn)

如此一來(lái),在進(jìn)行網(wǎng)絡(luò)訓(xùn)練時(shí),將is_training設(shè)為True;測(cè)試網(wǎng)絡(luò)時(shí)設(shè)為False即可。

精簡(jiǎn)代碼

在前文中我們寫了很多行代碼才實(shí)現(xiàn)了BN層的基本功能。

但是,我們完全可以用一行代碼進(jìn)行!

下面三種函數(shù)都可以實(shí)現(xiàn)BN層,因?yàn)槎际欠庋b好的函數(shù),有興趣的讀者完全可以自行測(cè)試。

TensorFlow實(shí)現(xiàn)

有BN層的仿Lenet-5模型前趨關(guān)系代碼:

前趨關(guān)系

關(guān)于詳細(xì)如何實(shí)現(xiàn)BN層的,可以參考我給出的實(shí)例代碼,基于MNIST數(shù)據(jù)集非常簡(jiǎn)單:https://pan.baidu.com/s/11cnPkDAiuOFN4wgUv-l7_w

卷尾語(yǔ)萬(wàn)般不愿,終于還是開(kāi)學(xué)了...希望這學(xué)習(xí)的學(xué)習(xí)能有所提高!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡(jiǎn)書(shū)系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

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