在TensorFlow上實現(xiàn)BatchNormalization

為什么要用batch normalization

對于‘白化’(高斯分布,且特征間獨立)的數(shù)據(jù),神經(jīng)網(wǎng)絡(luò)一般有更快的收斂速度。使用batch normalization這個方法,可以使得每一層網(wǎng)絡(luò)的輸入(也就是上一層網(wǎng)絡(luò)的輸出)都‘白化’,從而加快收斂速度,但是也有可能某一層的網(wǎng)絡(luò)不想要輸入是高斯分布的,所以引入了兩個可學(xué)習(xí)的參數(shù)來使得這種‘高斯分布化’可以取消,所以每一層的輸入可能是高斯分布的,也可能不是,取決于這一層需要哪一種輸入。

如何用tensorflow實現(xiàn)batchnormalization

下面是我在stackoverflow?上找到的答案。主要分成4部分

下面是原文答案


下面是我在mnist數(shù)據(jù)中上用網(wǎng)絡(luò)結(jié)構(gòu)為(conv1-maxpool-bn-relu-conv2-maxpool-bn-relu-fc1-bn-relu-fc2-bn-relu-fc->輸出)的步驟和結(jié)果


1.定義一個占位符,來區(qū)別當(dāng)前是屬于訓(xùn)練階段還是測試階段

這個主要是和bn的原理有關(guān),在訓(xùn)練階段,bn要計算batch的方差和均值,在測試階段,方差和均值是直接調(diào)用得到的(從訓(xùn)練算出來的值)


2.在每一層的卷積輸出(或者是全連接層輸出)后,激活函數(shù)前,插入bn層

下面圖片中x是卷積層的輸出,在relu前加入bn

3.定義單獨的op,在訓(xùn)練或者測試的時候運行,記得給第一步定義的占位符賦值(True表示訓(xùn)練中,F(xiàn)alse表示非訓(xùn)練)


4.最后一步就是訓(xùn)練或者是測試的時候單獨運行3定義的ops啦


結(jié)果對比:

從accuracy來看,在relu前面加入bn使得訓(xùn)練收斂的速度快很多

loss對比


下面是conv層的輸出(插入bn再relu)



下面是conv層的輸出(只有relu)



結(jié)論:

使用bn可以加快收斂的速度,減少訓(xùn)練的時間。而且利用tensorflow來實現(xiàn)bn操作并不復(fù)雜,所以建議在訓(xùn)練網(wǎng)絡(luò)中插入bn層。

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

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

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