21個(gè)深度學(xué)習(xí)調(diào)參技巧,一定要看到最后一個(gè)
點(diǎn)擊上方“小白學(xué)視覺(jué)”,選擇加"星標(biāo)"或“置頂”
重磅干貨,第一時(shí)間送達(dá)
本文轉(zhuǎn)自|AI算法與圖像處理
訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)是困難的。它需要知識(shí)和經(jīng)驗(yàn),以適當(dāng)?shù)挠?xùn)練和獲得一個(gè)最優(yōu)模型。在這篇文章中,我想分享我在訓(xùn)練深度神經(jīng)網(wǎng)絡(luò)時(shí)學(xué)到的東西。以下提示和技巧可能對(duì)你的研究有益,并可以幫助你加速網(wǎng)絡(luò)架構(gòu)或參數(shù)搜索。
現(xiàn)在,讓我們開(kāi)始吧……
整理自:https://towardsdatascience.com/a-bunch-of-tips-and-tricks-for-training-deep-neural-networks-3ca24c31ddc8
1
在你開(kāi)始建立你的網(wǎng)絡(luò)體系結(jié)構(gòu),你需要做的第一件事是驗(yàn)證輸入到網(wǎng)絡(luò)的數(shù)據(jù),確保輸入(x)對(duì)應(yīng)于一個(gè)標(biāo)簽(y)。在預(yù)測(cè)的情況下,確保真實(shí)標(biāo)簽(y)正確編碼標(biāo)簽索引(或者one-hot-encoding)。否則,訓(xùn)練就不起作用。
2
決定是選擇使用預(yù)模型還是從頭開(kāi)始訓(xùn)練你的網(wǎng)絡(luò)?
如果問(wèn)題域中的數(shù)據(jù)集類(lèi)似于ImageNet數(shù)據(jù)集,則對(duì)該數(shù)據(jù)集使用預(yù)訓(xùn)練模型。使用最廣泛的預(yù)訓(xùn)練模型有VGG net、ResNet、DenseNet或Xception等。有許多層架構(gòu),例如,VGG(19和16層),ResNet(152, 101, 50層或更少),DenseNet(201, 169和121層)。注意:不要嘗試通過(guò)使用更多的層網(wǎng)來(lái)搜索超參數(shù)(例如VGG-19, ResNet-152或densen -201層網(wǎng)絡(luò),因?yàn)樗谟?jì)算量很大),而是使用較少的層網(wǎng)(例如VGG-16, ResNet-50或densen -121層)。選擇一個(gè)預(yù)先訓(xùn)練過(guò)的模型,你認(rèn)為它可以用你的超參數(shù)提供最好的性能(比如ResNet-50層)。在你獲得最佳超參數(shù)后,只需選擇相同但更多的層網(wǎng)(如ResNet-101或ResNet-152層),以提高準(zhǔn)確性。
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
微調(diào)幾層,或者如果你有一個(gè)小的數(shù)據(jù)集,只訓(xùn)練分類(lèi)器,你也可以嘗試在你要微調(diào)的卷積層之后插入Dropout層,因?yàn)樗梢詭椭鷮?duì)抗網(wǎng)絡(luò)中的過(guò)擬合。
Dropout:http://jmlr.org/papers/v15/srivastava14a.html
如果你的數(shù)據(jù)集與ImageNet數(shù)據(jù)集不相似,你可以考慮從頭構(gòu)建并訓(xùn)練你的網(wǎng)絡(luò)。
3
BatchNormalization:https://arxiv.org/abs/1502.03167
InstanceNormalization:https://arxiv.org/abs/1607.08022
GroupNormalization:https://arxiv.org/abs/1803.08494
4
如果你有兩個(gè)或更多的卷積層(比如Li)對(duì)相同的輸入(比如F)進(jìn)行操作(參考下面的示意圖理解),那么在特征連接后使用SpatialDropout。由于這些卷積層是在相同的輸入上操作的,因此輸出特征很可能是相關(guān)的。因此,SpatialDropout刪除了那些相關(guān)的特征,并防止網(wǎng)絡(luò)中的過(guò)擬合。
注意: 它主要用于較低的層而不是較高的層。
SpatialDropout:https://arxiv.org/abs/1411.4280

5
為了確定你的網(wǎng)絡(luò)容量,嘗試用一小部分訓(xùn)練例子來(lái)超載你的網(wǎng)絡(luò)(andrej karpathy的提示)。如果它沒(méi)有超載,增加你的網(wǎng)絡(luò)容量。在過(guò)擬合后,使用正則化技巧如L1、L2、Dropout或其他技術(shù)來(lái)對(duì)抗過(guò)擬合。
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
如果你的問(wèn)題域與稠密預(yù)測(cè)(dense prediction)相關(guān)(如語(yǔ)義分割),我建議你使用膨脹殘差網(wǎng)絡(luò)作為預(yù)訓(xùn)練模型,因?yàn)樗钸m合稠密預(yù)測(cè)。
Dilated Residual Networks:https://arxiv.org/abs/1705.09914
10
要捕獲對(duì)象周?chē)纳舷挛男畔?,可以使用多尺度特性的池化模塊。該思想成功地應(yīng)用于語(yǔ)義分割或前景分割中。
semantic segmentation:https://arxiv.org/abs/1802.02611
foreground segmentation:https://arxiv.org/abs/1808.01477
11
12
如果你有高度不平衡的數(shù)據(jù)問(wèn)題,在訓(xùn)練期間應(yīng)用類(lèi)別加權(quán)操作。換句話(huà)說(shuō),給稀少的類(lèi)更多的權(quán)重,但給主要類(lèi)更少的權(quán)重。使用sklearn可以很容易地計(jì)算類(lèi)權(quán)重?;蛘邍L試使用過(guò)采樣和欠采樣技術(shù)重新采樣你的訓(xùn)練集。這也可以幫助提高預(yù)測(cè)的準(zhǔn)確性。
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
有三個(gè)學(xué)習(xí)率起點(diǎn)(即1e- 1,1e -3和1e-6)。如果您對(duì)預(yù)訓(xùn)練模型進(jìn)行微調(diào),請(qǐng)考慮小于1e-3(比如1e-4)的低學(xué)習(xí)率。如果您從頭開(kāi)始訓(xùn)練您的網(wǎng)絡(luò),請(qǐng)考慮一個(gè)大于或等于1e-3的學(xué)習(xí)率。您可以嘗試這些起點(diǎn),并調(diào)整它們,看看哪個(gè)是最好的,選擇那個(gè)。還有一件事,您可以考慮通過(guò)使用 Learning Rate Schedulers來(lái)降低訓(xùn)練過(guò)程中的學(xué)習(xí)率。這也可以幫助提高網(wǎng)絡(luò)性能。
Learning Rate Schedulers:https://keras.io/callbacks/#learningratescheduler
15
除了Learning Rate Schedule 外,即在一定的次數(shù)后降低學(xué)習(xí)率,還有另一種方式,我們可以由一些因素減少學(xué)習(xí)率,如果驗(yàn)證損loss在某些epoch(比如5)停止改善,減小學(xué)習(xí)率和如果驗(yàn)證損失停止改善在某些epoch(比如10),停止訓(xùn)練過(guò)程。這可以通過(guò)在Keras中使用early stop的ReduceLROnPlateau很容易做到。
ReduceLROnPlateau:https://keras.io/callbacks/#reducelronplateau
EarlyStopping:https://keras.io/callbacks/#earlystopping
16
如果您在dense prediction領(lǐng)域工作,如前景分割或語(yǔ)義分割,您應(yīng)該使用跳過(guò)連接,因?yàn)閷?duì)象邊界或有用的信息會(huì)由于最大池化操作或strided convolutions而丟失。這也可以幫助您的網(wǎng)絡(luò)輕松地學(xué)習(xí)特征空間到圖像空間的特征映射,有助于緩解網(wǎng)絡(luò)中的消失梯度問(wèn)題。
skip connections:https://arxiv.org/abs/1505.04597
17
18
你必須要有一個(gè)高速的GPU來(lái)進(jìn)行訓(xùn)練,但是這有點(diǎn)昂貴。如果你想使用免費(fèi)的云GPU,我推薦使用谷歌Colab。如果你不知道從哪里開(kāi)始,看看我之前的文章或者嘗試各種云GPU平臺(tái),如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之前使用最大池化來(lái)節(jié)省一些計(jì)算。由于ReLU閾值的值為0:f(x)=max(0,x)和最大池化只有max激活:f(x)=max(x1,x2,…,xi),使用Conv > MaxPool > ReLU 而不是Conv > ReLU > MaxPool。
例如,假設(shè)我們有兩個(gè)從Conv來(lái)的激活值(即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
考慮采用深度可分離卷積運(yùn)算,與常規(guī)的卷積運(yùn)算相比,該運(yùn)算速度快,且參數(shù)數(shù)量大大減少。
Depthwise Separable Convolution:https://arxiv.org/abs/1610.02357
21
交流群
歡迎加入公眾號(hào)讀者群一起和同行交流,目前有SLAM、三維視覺(jué)、傳感器、自動(dòng)駕駛、計(jì)算攝影、檢測(cè)、分割、識(shí)別、醫(yī)學(xué)影像、GAN、算法競(jìng)賽等微信群(以后會(huì)逐漸細(xì)分),請(qǐng)掃描下面微信號(hào)加群,備注:”昵稱(chēng)+學(xué)校/公司+研究方向“,例如:”張三 + 上海交大 + 視覺(jué)SLAM“。請(qǐng)按照格式備注,否則不予通過(guò)。添加成功后會(huì)根據(jù)研究方向邀請(qǐng)進(jìn)入相關(guān)微信群。請(qǐng)勿在群內(nèi)發(fā)送廣告,否則會(huì)請(qǐng)出群,謝謝理解~

