經驗之談|別再在CNN中使用Dropout了

重磅乾貨,第一時間送達

作者:Harrison Jansma

編譯:ronghuaiyang

經驗之談|別再在CNN中使用Dropout了

我注意到有很多關於學習深度學習和將什麼是深度學習的資源。但是不幸的是,等到真正需要做一個模型的時候,解釋如何去做,何時去做的資源又很少。

我寫這篇文章的目的是為了那些嘗試去實現深度學習的人,這樣你就不必像我一樣去看原始的論文或者看Reddit中的討論了。

本文會告訴你為什麼dropout在CNN的結構中會漸漸失寵。

Dropout

如果你在讀這篇文章的話,我假設你有一些對dropout的基本理解,以及它在神經網路中扮演的正則化的角色。

經驗之談|別再在CNN中使用Dropout了

通常來說,只有當我們的網路有過擬合的風險的時候,才需要進行正則化。當網路非常大,訓練時間非常長,也沒有足夠的資料的時候,才可能發生。

如果你的網路的最後有全連線層的話,使用dropout非常的容易。

Keras 實現

python

keras。layers。Dropout(rate, noise_shape=None, seed=None)

dropout的比例從0。5開始,逐漸減小直到模型的表現最好。

例子:

model=keras。models。Sequential()

model。add(keras。layers。Dense(150, activation=“relu”))

model。add(keras。layers。Dropout(0。5))

經驗之談|別再在CNN中使用Dropout了

注意,這裡只在CNN中的全連線層使用。對於其他的層則不用dropout。

作為替代,你應該在卷積中插入batch normalization,這個也會正則化你的模型,同時讓訓練更加的穩定。

Batch Normalization

Batch normalization是另外一個隊CNN進行正則化的方法。

除了正則化的作用外,batch normalization還避免了CNN訓練中的梯度消失的問題。這個可以減小訓練的時間,得到更好的結果。

經驗之談|別再在CNN中使用Dropout了

Keras實現

在Keras中實現 batch normalization,使用下面的方法:

keras。layers。BatchNormalization()

當使用batch normalization來構建CNN結構時:

- 在卷積層和啟用層之間插入batch normalization。

- batch normalization有些超引數需要除錯,可以試試。

也可以在啟用函式之後插入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用來構建,訓練和進行推理。得到的網路訓練時具有飽和的非線性性,對於大的學習率更加的魯棒,往往不需要使用Dropout來進行正則化。”-Ioffe 和 Svegedy

至於為什麼dropout漸漸失寵,有兩個原因。

第一,dropout對卷積層的正則化的作用很小

原因呢?由於卷積層只有很少的引數,他們本身就不需要多少正則化。更進一步說,特徵圖編碼的是空間的關係,特徵圖的啟用是高度相關的,這也導致了dropout的失效。

第二,dropout所擅長的正則化慢慢的過時了

像VGG16這樣的大型的網路後面有全連線層,對於這樣的模型,需要考慮過擬合,所以在全連線之間使用dropout。

經驗之談|別再在CNN中使用Dropout了

但是不幸的時,現在的結構中全連線層被移除了。

我們使用了global average pooling來代替了全連線層,這種卷積網路可以減小模型的size,同時提高模型的表現。

實驗

我做了一個實驗,試試看是否 batch normalization可以減少泛化誤差。

我構建了5個完全相同的卷積網路結構,然後分別在卷積之間插入dropout,batch norm,或者什麼也不插入(control)。

經驗之談|別再在CNN中使用Dropout了

在Cifar100的資料集上訓練每個模型,我得到了下面的結果。

經驗之談|別再在CNN中使用Dropout了

使用batch norm的表現最好,說明在卷積之間應該使用batch norm。

更進一步說,dropout不應該放在卷積之間,dropout越大,模型表現越差。

重點

如果你不知道是否應該在CNN中使用dropout,那麼現在你應該知道了。只在有全連線的時候用dropout,在卷積之間使用 batch normalization。

下載1:OpenCV-Contrib擴充套件模組中文版教程

下載2:Python視覺實戰專案52講

下載3:OpenCV實戰專案20講

交流群