深度学习模型训练过程
深度學(xué)習(xí)模型訓(xùn)練過程
一.數(shù)據(jù)準(zhǔn)備
- 基本原則:
1)數(shù)據(jù)標(biāo)注前的標(biāo)簽體系設(shè)定要合理
2)用于標(biāo)注的數(shù)據(jù)集需要無偏、全面、盡可能均衡
3)標(biāo)注過程要審核
- 整理數(shù)據(jù)集
1)將各個(gè)標(biāo)簽的數(shù)據(jù)放于不同的文件夾中,并統(tǒng)計(jì)各個(gè)標(biāo)簽的數(shù)目
2)樣本均衡,樣本不會(huì)絕對均衡,差不多就行了
3)切分樣本集
如:90%用于訓(xùn)練,10%留著測試,比例自己定。訓(xùn)練集合,對于弱勢類要重采樣,最后的圖片列表要shuffle;測試集合就不用重采樣了。
訓(xùn)練中要保證樣本均衡,學(xué)習(xí)到弱勢類的特征,測試過程要反應(yīng)真實(shí)的數(shù)據(jù)集分布。
4)按需要的格式生成tfrecord
按照train.list和validation.list生成需要的格式。生成和解析tfrecord的代碼要根據(jù)具體情況編寫。
二.基本步驟
-
定義算法公式,也就是神經(jīng)網(wǎng)絡(luò)的前向算法。我們一般使用現(xiàn)成的網(wǎng)絡(luò),如inceptionV4,mobilenet等。
-
定義loss,選擇優(yōu)化器,來讓loss最小
-
對數(shù)據(jù)進(jìn)行迭代訓(xùn)練,使loss到達(dá)最小
-
在測試集或者驗(yàn)證集上對準(zhǔn)確率進(jìn)行評估
三.訓(xùn)練
- 預(yù)處理,根據(jù)自己的喜好,編寫預(yù)處理策略。
preprocessing的方法,變換方案諸如:隨機(jī)裁剪、隨機(jī)變換框、添加光照飽和度、修改壓縮系數(shù)、各種縮放方案、多尺度等。進(jìn)而,減均值除方差或歸一化到[-1,1],將float類型的Tensor送入網(wǎng)絡(luò)。
這一步的目的是:讓網(wǎng)絡(luò)接受的訓(xùn)練樣本盡可能多樣,不要最后出現(xiàn)原圖沒問題,改改分辨率或?qū)捀弑染凸蛄说那闆r。
- 網(wǎng)絡(luò)設(shè)計(jì),基礎(chǔ)網(wǎng)絡(luò)的選擇和Loss的設(shè)計(jì)。
基礎(chǔ)網(wǎng)絡(luò)的選擇和問題的復(fù)雜程度息息相關(guān),用ResNet18可以解決的沒必要用101;還有一些SE、GN等模塊加上去有沒有提升也可以去嘗試。
Loss的設(shè)計(jì),一般問題的抽象就是設(shè)計(jì)Loss數(shù)據(jù)公式的過程。比如多任務(wù)中的各個(gè)任務(wù)權(quán)重配比,centor Loss可以讓特征分布更緊湊,SmoothL1Loss更平滑避免梯度爆炸等。
- 優(yōu)化算法
一般來說,只要時(shí)間足夠,Adam和SGD+Momentum可以達(dá)到的效果差異不大。用框架提供的理論上最好的優(yōu)化策略就是了。
- 訓(xùn)練過程
finetune網(wǎng)絡(luò),我習(xí)慣分兩步:首先訓(xùn)練fc層,迭代幾個(gè)epoch后保存模型;然后基于得到的模型,訓(xùn)練整個(gè)網(wǎng)絡(luò),一般迭代40-60個(gè)epoch可以得到穩(wěn)定的結(jié)果。total_loss會(huì)一直下降的,過程中可以評測下模型在測試集上的表現(xiàn)。真正的loss往往包括兩部分。后面total_loss的下降主要是正則項(xiàng)的功勞了。
四.難點(diǎn)
- 訓(xùn)練速度慢,收斂慢
深度學(xué)習(xí)其實(shí)就是一個(gè)反復(fù)調(diào)整模型參數(shù)的過程,得力于GPU等硬件性能的提升,使得復(fù)雜的深度學(xué)習(xí)訓(xùn)練成為了可能。收斂速度過慢,訓(xùn)練時(shí)間過長,一方面使得相同總訓(xùn)練時(shí)間內(nèi)的迭代次數(shù)變少,從而影響準(zhǔn)確率,另一方面使得訓(xùn)練次數(shù)變少,從而減少了嘗試不同超參數(shù)的機(jī)會(huì)。
-
設(shè)置合理的初始化權(quán)重w和偏置b
f(x) = w * x + b
-
優(yōu)化學(xué)習(xí)率
型訓(xùn)練就是不斷嘗試和調(diào)整不同的w和b,那么每次調(diào)整的幅度是多少呢,這個(gè)就是學(xué)習(xí)率。
-
網(wǎng)絡(luò)節(jié)點(diǎn)輸入值正則化 batch normalization
神經(jīng)網(wǎng)絡(luò)訓(xùn)練時(shí),每一層的輸入分布都在變化。不論輸入值大還是小,我們的學(xué)習(xí)率都是相同的,這顯然是很浪費(fèi)效率的。而且當(dāng)輸入值很小時(shí),為了保證對它的精細(xì)調(diào)整,學(xué)習(xí)率不能設(shè)置太大。那有沒有辦法讓輸入值標(biāo)準(zhǔn)化得落到某一個(gè)范圍內(nèi),比如[0, 1]之間呢,這樣我們就再也不必為太小的輸入值而發(fā)愁了。
辦法當(dāng)然是有的,那就是正則化!由于我們學(xué)習(xí)的是輸入的特征分布,而不是它的絕對值,故可以對每一個(gè)mini-batch數(shù)據(jù)內(nèi)部進(jìn)行標(biāo)準(zhǔn)化,使他們規(guī)范化到[0, 1]內(nèi)。這就是Batch Normalization,簡稱BN。由大名鼎鼎的inception V2提出。它在每個(gè)卷積層后,使用一個(gè)BN層,從而使得學(xué)習(xí)率可以設(shè)定為一個(gè)較大的值。使用了BN的inceptionV2,只需要以前的1/14的迭代次數(shù)就可以達(dá)到之前的準(zhǔn)確率,大大加快了收斂速度。
-
采用更先進(jìn)的網(wǎng)絡(luò)結(jié)構(gòu),減少參數(shù)量
1)使用小卷積核來代替大卷積核。
VGGNet全部使用3x3的小卷積核,來代替AlexNet中11x11和5x5等大卷積核。小卷積核雖然參數(shù)量較少,但也會(huì)帶來特征面積捕獲過小的問題。inception
net認(rèn)為越往后的卷積層,應(yīng)該捕獲更多更高階的抽象特征。因此它在靠后的卷積層中使用的5x5等大面積的卷積核的比率較高,而在前面幾層卷積中,更多使用的是1x1和3x3的卷積核。
2)使用兩個(gè)串聯(lián)小卷積核來代替一個(gè)大卷積核。
inceptionV2中創(chuàng)造性的提出了兩個(gè)3x3的卷積核代替一個(gè)5x5的卷積核。在效果相同的情況下,參數(shù)量僅為原先的3x3x2 / 5x5 = 18/25
3)1x1卷積核的使用。
1x1的卷積核可以說是性價(jià)比最高的卷積了,沒有之一。它在參數(shù)量為1的情況下,同樣能夠提供線性變換,relu激活,輸入輸出channel變換等功能。VGGNet創(chuàng)造性的提出了1x1的卷積核
3)非對稱卷積核的使用。
inceptionV3中將一個(gè)7x7的卷積拆分成了一個(gè)1x7和一個(gè)7x1,
卷積效果相同的情況下,大大減少了參數(shù)量,同時(shí)還提高了卷積的多樣性。
4)depthwise卷積的使用。
mobileNet中將一個(gè)3x3的卷積拆分成了串聯(lián)的一個(gè)3x3 depthwise卷積和一個(gè)1x1正常卷積。對于輸入channel為M,輸出為N的卷積,正常情況下,每個(gè)輸出channel均需要M個(gè)卷積核對輸入的每個(gè)channel進(jìn)行卷積,并疊加。也就是需要MxN個(gè)卷積核。而在depthwise卷積中,輸出channel和輸入相同,每個(gè)輸入channel僅需要一個(gè)卷積核。而將channel變換的工作交給了1x1的卷積。這個(gè)方法在參數(shù)量減少到之前1/9的情況下,精度仍然能達(dá)到80%。
5)全局平均池化代替全連接層。
這個(gè)才是大殺器!AlexNet和VGGNet中,全連接層幾乎占據(jù)了90%的參數(shù)量。inceptionV1創(chuàng)造性的使用全局平均池化來代替最后的全連接層,使得其在網(wǎng)絡(luò)結(jié)構(gòu)更深的情況下(22層,AlexNet僅8層),參數(shù)量只有500萬,僅為AlexNet的1/12。
總結(jié)
以上是生活随笔為你收集整理的深度学习模型训练过程的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。