經(jīng)驗之談|別再在CNN中使用Dropout了
點擊上方“小白學視覺”,選擇加"星標"或“置頂”
重磅干貨,第一時間送達
作者:Harrison Jansma
編譯:ronghuaiyang

我注意到有很多關于學習深度學習和將什么是深度學習的資源。但是不幸的是,等到真正需要做一個模型的時候,解釋如何去做,何時去做的資源又很少。
我寫這篇文章的目的是為了那些嘗試去實現(xiàn)深度學習的人,這樣你就不必像我一樣去看原始的論文或者看Reddit中的討論了。
本文會告訴你為什么dropout在CNN的結構中會漸漸失寵。
?

通常來說,只有當我們的網(wǎng)絡有過擬合的風險的時候,才需要進行正則化。當網(wǎng)絡非常大,訓練時間非常長,也沒有足夠的數(shù)據(jù)的時候,才可能發(fā)生。
如果你的網(wǎng)絡的最后有全連接層的話,使用dropout非常的容易。


python
model=keras.models.Sequential()
model.add(keras.layers.Dense(150, activation="relu"))
model.add(keras.layers.Dropout(0.5))

注意,這里只在CNN中的全連接層使用。對于其他的層則不用dropout。
作為替代,你應該在卷積中插入batch normalization,這個也會正則化你的模型,同時讓訓練更加的穩(wěn)定。
Batch normalization是另外一個隊CNN進行正則化的方法。
除了正則化的作用外,batch normalization還避免了CNN訓練中的梯度消失的問題。這個可以減小訓練的時間,得到更好的結果。



在Keras中實現(xiàn) batch normalization,使用下面的方法:
例子:
model.add(Conv2D(60,3, padding = "same"))
model.add(BatchNormalization())
model.add(Activation("relu"))
使用Batch normalization替換dropout.
如果你不用擔心過擬合的話,那么使用batch normalization有很多的好處。由于有正則化的作用,batch normalization可以很大程度上替代CNN中的dropout。
“我們提出了一種算法,使用batch normalization用來構建,訓練和進行推理。得到的網(wǎng)絡訓練時具有飽和的非線性性,對于大的學習率更加的魯棒,往往不需要使用Dropout來進行正則化?!?Ioffe 和 Svegedy
至于為什么dropout漸漸失寵,有兩個原因。
第一,dropout對卷積層的正則化的作用很小
原因呢?由于卷積層只有很少的參數(shù),他們本身就不需要多少正則化。更進一步說,特征圖編碼的是空間的關系,特征圖的激活是高度相關的,這也導致了dropout的失效。
第二,dropout所擅長的正則化慢慢的過時了
像VGG16這樣的大型的網(wǎng)絡后面有全連接層,對于這樣的模型,需要考慮過擬合,所以在全連接之間使用dropout。

但是不幸的時,現(xiàn)在的結構中全連接層被移除了。
我們使用了global average pooling來代替了全連接層,這種卷積網(wǎng)絡可以減小模型的size,同時提高模型的表現(xiàn)。

我做了一個實驗,試試看是否 batch normalization可以減少泛化誤差。
我構建了5個完全相同的卷積網(wǎng)絡結構,然后分別在卷積之間插入dropout,batch norm,或者什么也不插入(control)。


使用batch norm的表現(xiàn)最好,說明在卷積之間應該使用batch norm。
更進一步說,dropout不應該放在卷積之間,dropout越大,模型表現(xiàn)越差。
交流群
歡迎加入公眾號讀者群一起和同行交流,目前有SLAM、三維視覺、傳感器、自動駕駛、計算攝影、檢測、分割、識別、醫(yī)學影像、GAN、算法競賽等微信群(以后會逐漸細分),請掃描下面微信號加群,備注:”昵稱+學校/公司+研究方向“,例如:”張三?+?上海交大?+?視覺SLAM“。請按照格式備注,否則不予通過。添加成功后會根據(jù)研究方向邀請進入相關微信群。請勿在群內發(fā)送廣告,否則會請出群,謝謝理解~

