21個深度學習的調參技巧
點擊左上方藍字關注我們

整理自:https://towardsdatascience.com/a-bunch-of-tips-and-tricks-for-training-deep-neural-networks-3ca24c31ddc8
1
在你開始建立你的網絡體系結構,你需要做的第一件事是驗證輸入到網絡的數據,確保輸入(x)對應于一個標簽(y)。在預測的情況下,確保真實標簽(y)正確編碼標簽索引(或者one-hot-encoding)。否則,訓練就不起作用。
2
決定是選擇使用預模型還是從頭開始訓練你的網絡?
如果問題域中的數據集類似于ImageNet數據集,則對該數據集使用預訓練模型。使用最廣泛的預訓練模型有VGG net、ResNet、DenseNet或Xception等。有許多層架構,例如,VGG(19和16層),ResNet(152, 101, 50層或更少),DenseNet(201, 169和121層)。注意:不要嘗試通過使用更多的層網來搜索超參數(例如VGG-19, ResNet-152或densen -201層網絡,因為它在計算量很大),而是使用較少的層網(例如VGG-16, ResNet-50或densen -121層)。選擇一個預先訓練過的模型,你認為它可以用你的超參數提供最好的性能(比如ResNet-50層)。在你獲得最佳超參數后,只需選擇相同但更多的層網(如ResNet-101或ResNet-152層),以提高準確性。
ImageNet:http://www.image-net.org/challenges/LSVRC/2012/
VGG net :https://arxiv.org/abs/1409.1556
ResNet:https://arxiv.org/abs/1512.03385
DenseNet:https://arxiv.org/abs/1608.06993
Xception :https://arxiv.org/abs/1610.02357
微調幾層,或者如果你有一個小的數據集,只訓練分類器,你也可以嘗試在你要微調的卷積層之后插入Dropout層,因為它可以幫助對抗網絡中的過擬合。
Dropout:http://jmlr.org/papers/v15/srivastava14a.html
如果你的數據集與ImageNet數據集不相似,你可以考慮從頭構建并訓練你的網絡。
3
BatchNormalization:https://arxiv.org/abs/1502.03167
InstanceNormalization:https://arxiv.org/abs/1607.08022
GroupNormalization:https://arxiv.org/abs/1803.08494
4
如果你有兩個或更多的卷積層(比如Li)對相同的輸入(比如F)進行操作(參考下面的示意圖理解),那么在特征連接后使用SpatialDropout。由于這些卷積層是在相同的輸入上操作的,因此輸出特征很可能是相關的。因此,SpatialDropout刪除了那些相關的特征,并防止網絡中的過擬合。
注意: 它主要用于較低的層而不是較高的層。
SpatialDropout:https://arxiv.org/abs/1411.4280

5
為了確定你的網絡容量,嘗試用一小部分訓練例子來超載你的網絡(andrej karpathy的提示)。如果它沒有超載,增加你的網絡容量。在過擬合后,使用正則化技巧如L1、L2、Dropout或其他技術來對抗過擬合。
L1:https://keras.io/regularizers/
L2:https://keras.io/regularizers/
Dropout:http://jmlr.org/papers/v15/srivastava14a.html
6
from keras.constraints import max_normmodel.add(Dense(64, kernel_constraint=max_norm(2.)))model.add(Conv2D(64, kernel_constraint=max_norm(2.)))
7
8
9
如果你的問題域與稠密預測(dense prediction)相關(如語義分割),我建議你使用膨脹殘差網絡作為預訓練模型,因為它最適合稠密預測。
Dilated Residual Networks:https://arxiv.org/abs/1705.09914
10
要捕獲對象周圍的上下文信息,可以使用多尺度特性的池化模塊。該思想成功地應用于語義分割或前景分割中。
semantic segmentation:https://arxiv.org/abs/1802.02611
foreground segmentation:https://arxiv.org/abs/1808.01477
11
12
如果你有高度不平衡的數據問題,在訓練期間應用類別加權操作。換句話說,給稀少的類更多的權重,但給主要類更少的權重。使用sklearn可以很容易地計算類權重。或者嘗試使用過采樣和欠采樣技術重新采樣你的訓練集。這也可以幫助提高預測的準確性。
sklearn:http://scikit-learn.org/stable/modules/generated/sklearn.utils.class_weight.compute_class_weight.html
OverSampling and UnderSampling techniques:https://en.wikipedia.org/wiki/Oversampling_and_undersampling_in_data_analysis
13

14
有三個學習率起點(即1e- 1,1e -3和1e-6)。如果您對預訓練模型進行微調,請考慮小于1e-3(比如1e-4)的低學習率。如果您從頭開始訓練您的網絡,請考慮一個大于或等于1e-3的學習率。您可以嘗試這些起點,并調整它們,看看哪個是最好的,選擇那個。還有一件事,您可以考慮通過使用 Learning Rate Schedulers來降低訓練過程中的學習率。這也可以幫助提高網絡性能。
Learning Rate Schedulers:https://keras.io/callbacks/#learningratescheduler
15
除了Learning Rate Schedule 外,即在一定的次數后降低學習率,還有另一種方式,我們可以由一些因素減少學習率,如果驗證損loss在某些epoch(比如5)停止改善,減小學習率和如果驗證損失停止改善在某些epoch(比如10),停止訓練過程。這可以通過在Keras中使用early stop的ReduceLROnPlateau很容易做到。
ReduceLROnPlateau:https://keras.io/callbacks/#reducelronplateau
EarlyStopping:https://keras.io/callbacks/#earlystopping
16
如果您在dense prediction領域工作,如前景分割或語義分割,您應該使用跳過連接,因為對象邊界或有用的信息會由于最大池化操作或strided convolutions而丟失。這也可以幫助您的網絡輕松地學習特征空間到圖像空間的特征映射,有助于緩解網絡中的消失梯度問題。
skip connections:https://arxiv.org/abs/1505.04597
17
18
你必須要有一個高速的GPU來進行訓練,但是這有點昂貴。如果你想使用免費的云GPU,我推薦使用谷歌Colab。如果你不知道從哪里開始,看看我之前的文章或者嘗試各種云GPU平臺,如Floydhub或Paperspace等。
Google Colab:https://colab.research.google.com/notebooks/welcome.ipynb#recent=true
使用教程:https://towardsdatascience.com/a-comprehensive-guide-on-how-to-fine-tune-deep-neural-networks-using-keras-on-google-colab-free-daaaa0aced8f
Floydhub:https://www.floydhub.com
Paperspace:https://www.paperspace.com
19
在ReLU之前使用最大池化來節(jié)省一些計算。由于ReLU閾值的值為0:f(x)=max(0,x)和最大池化只有max激活:f(x)=max(x1,x2,…,xi),使用Conv > MaxPool > ReLU 而不是Conv > ReLU > MaxPool。
例如,假設我們有兩個從Conv來的激活值(即0.5和-0.5):
因此MaxPool > ReLU = max(0, max(0.5,-0.5)) = 0.5
和ReLU > MaxPool = max(max(0,0.5), max(0,-0.5)) = 0.5
20
考慮采用深度可分離卷積運算,與常規(guī)的卷積運算相比,該運算速度快,且參數數量大大減少。
Depthwise Separable Convolution:https://arxiv.org/abs/1610.02357
21
END
整理不易,點贊三連↓
