當前位置:
首頁 > 最新 > 如何1行BN「批規範化」提高訓練速度準確率,有深度學習5層網路比較源碼

如何1行BN「批規範化」提高訓練速度準確率,有深度學習5層網路比較源碼

卷首語:

首先,筆者在這裡祝大家新年快樂!!!今天我們來探討的問題是BN層在TensorFlow中的實現,以實踐為主,理論方面會跳過一些不易被理解的部分,讓大家可以快速搭建並投入使用。

在文章的最後我也會給出相應的效果對比,猶豫要不要學習的讀者可以先看看最後在做決定~

在訓練模型時,我們經常會在一些需要調整的參數上浪費時間:學習率,學習衰減率,正則……

況且即便我們調整了很多次參數,也未必見得可以提高模型的訓練效果,甚至還有可能產生梯度消失等等一系列令人頭疼的問題。

但是,這種現象在Inception-v2中就已經發生了改變。在Inception模型升級時引入了一種新的網路層「Batch Normalization」

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

為了降低學習難度,筆者在這裡給出一個精簡的公式:

BN公式

下面,讓我們對公式逐一地進行分解(註:有微積分基礎的讀者想必就不用我多說了,可以跳過理論這段)


均值(mean):

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

mean = 數組和/數量

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

mean = 3

方差(variance):

讓我們繼續使用上一數組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

內部參數

x:輸入進行計算的張量

axes:需要計算的維度

name:命名

keep_dims:是否保持維度

TensorFlow實現


在公式中,我們可以將「縮放」與「偏移」理解為兩組可被訓練的Weights

縮放(scale):

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

TensorFlow實現

偏移(offset):

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

TensorFlow實現

按照上面所講的,公式中的內容我們已經解析完全,接下來我們只需要套用一個現成的函數:

TensorFlow實現


在上面的函數中,我們將「輸入」「均值」「方差」「偏移」「縮放」都添加了進去,最後還有個參數:variance_epsilon = 0.001

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

大概的意思就是需設定一個浮點數用來避免除以產生的梯度爆炸

雖然在方差被除等於零是幾率很小的事,可在幾十層甚至幾百層的神經網路里,計算量也要大的驚人,根據墨菲定律:會出錯的事總會出錯


註:BN層在訓練與測試時所用的滑動平均和滑動方差不同

申請滑動平均與滑動方差(這裡就應該不用我多敘述了,純基礎範圍,不太理解的可以去找一下關於滑動平均的博文):

TensorFlow實現

計算滑動平均與滑動方差:

TensorFlow實現

存儲優化參數:

TensorFlow實現

TensorFlow實現

如此一來,在進行網路訓練時,將is_training設為True;測試網路時設為False即可。


在前文中我們寫了很多行代碼才實現了BN層的基本功能。

但是,我們完全可以用一行代碼進行!

下面三種函數都可以實現BN層,因為都是封裝好的函數,有興趣的讀者完全可以自行測試。

TensorFlow實現


最後,讓我們對比一下有無BN層的效果:

筆者為了讓效果看起來更明顯,基礎學習率設定成了0.99,在實際的訓練過程中請根據情況適當修改。

關於BN演算法,筆者直接採用Slim封裝好的Batch_norm()函數。

對比模型是一個五層的卷積網路,在MNIST數據集上進行迭代1000次訓練。

損失函數,優化函數以及訓練過程

全連接層

加入了BN演算法的五層CNN模型,我在這裡使用的是Slim工具包封裝好的Batch_norm函數

加入了BN演算法的訓練效果

接下來,我們將所有的slim.batch_norm進行刪除,訓練效果如下

不添加BN演算法的訓練效果

可以看出添加了BN演算法的模型不論是學習速度還是穩定性都要高於不添加BN演算法的模型。

但要明白,現在只採用MNIST數據集,有興趣的讀者大可在自己的模型中添加BN層,在Cifar-10等數據集上的效果會更佳明顯一些。

卷尾語:我愛學習學習愛我...筆者這個新年過的...嘖...一言難盡,一定要注意食量啊注意食量!!!

最後,如果需要代碼或者想跟小編聯繫,一起討論學習。歡迎大家在下方評論進行留言,喜歡記得添加關注哦!!!

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 昂鈦客AI 的精彩文章:

小伙1小時敲出AlexNet,深度學習tensorflow原創體驗,代碼可運行

TAG:昂鈦客AI |