為什么要用batch normalization
對于‘白化’(高斯分布害幅,且特征間獨立)的數(shù)據(jù)刻两,神經(jīng)網(wǎng)絡(luò)一般有更快的收斂速度挽鞠。使用batch normalization這個方法媚赖,可以使得每一層網(wǎng)絡(luò)的輸入(也就是上一層網(wǎng)絡(luò)的輸出)都‘白化’闹究,從而加快收斂速度,但是也有可能某一層的網(wǎng)絡(luò)不想要輸入是高斯分布的幔崖,所以引入了兩個可學習的參數(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ū)別當前是屬于訓練階段還是測試階段
這個主要是和bn的原理有關(guān),在訓練階段用踩,bn要計算batch的方差和均值渠退,在測試階段忙迁,方差和均值是直接調(diào)用得到的(從訓練算出來的值)
2.在每一層的卷積輸出(或者是全連接層輸出)后,激活函數(shù)前碎乃,插入bn層
下面圖片中x是卷積層的輸出姊扔,在relu前加入bn
3.定義單獨的op,在訓練或者測試的時候運行,記得給第一步定義的占位符賦值(True表示訓練中梅誓,F(xiàn)alse表示非訓練)
4.最后一步就是訓練或者是測試的時候單獨運行3定義的ops啦
結(jié)果對比:
從accuracy來看旱眯,在relu前面加入bn使得訓練收斂的速度快很多
loss對比
下面是conv層的輸出(插入bn再relu)
下面是conv層的輸出(只有relu)
結(jié)論:
使用bn可以加快收斂的速度,減少訓練的時間证九。而且利用tensorflow來實現(xiàn)bn操作并不復(fù)雜,所以建議在訓練網(wǎng)絡(luò)中插入bn層共虑。