李克祥 王國(guó)慶 鄭國(guó)華 潘海華 周昌智
(浙江索思科技有限公司,浙江 溫州 325000)
傳統(tǒng)機(jī)器學(xué)習(xí)方法往往是針對(duì)特定任務(wù)創(chuàng)建數(shù)據(jù)訓(xùn)練模型的,這也導(dǎo)致模型之間互相孤立、毫無聯(lián)系,訓(xùn)練習(xí)得的內(nèi)容并沒有延續(xù)下去。遷移學(xué)習(xí)是將在一個(gè)場(chǎng)景中獲得的知識(shí)經(jīng)驗(yàn)應(yīng)用到新的場(chǎng)景中,以達(dá)到輔助學(xué)習(xí)的目的,遷移學(xué)習(xí)使模型之間可以傳遞學(xué)習(xí)內(nèi)容,避免花費(fèi)大量時(shí)間和資源重新標(biāo)記數(shù)據(jù)、訓(xùn)練模型[1]。遷移學(xué)習(xí)利用其他模型已經(jīng)學(xué)習(xí)的知識(shí)來提高新模型的性能,節(jié)約模型訓(xùn)練的計(jì)算資源,當(dāng)數(shù)據(jù)稀缺或獲取成本高昂時(shí),能夠利用更少的數(shù)據(jù)獲得穩(wěn)定的模型,提高模型泛化能力和模型訓(xùn)練效率。
預(yù)訓(xùn)練模型(pre-trained model)一般是在規(guī)模足夠大的數(shù)據(jù)集下進(jìn)行訓(xùn)練而產(chǎn)生的,具備很多的參數(shù)量以及復(fù)雜的網(wǎng)絡(luò)結(jié)構(gòu),是為解決類似問題而創(chuàng)造的。對(duì)當(dāng)前大部分的圖像識(shí)別處理預(yù)訓(xùn)練模型來說,訓(xùn)練的原始數(shù)據(jù)集一般可以通用,預(yù)訓(xùn)練網(wǎng)絡(luò)學(xué)到的特征空間層次結(jié)構(gòu)和權(quán)重不需要過多修改就可以應(yīng)用到特定的新問題上,也就是所謂的微調(diào)(fine tune),是“遷移學(xué)習(xí)”的一種方式。預(yù)訓(xùn)練模型使深度學(xué)習(xí)對(duì)處理小數(shù)據(jù)問題更有效,這也是深度學(xué)習(xí)的一個(gè)優(yōu)勢(shì)[2]。
深度學(xué)習(xí)隨著網(wǎng)絡(luò)層數(shù)的加深,理論上模型的表達(dá)能力會(huì)逐漸提高,但是卷積神經(jīng)網(wǎng)絡(luò)CNN到達(dá)一定的深度后,分類性能不再提高,反而導(dǎo)致網(wǎng)絡(luò)收斂變緩,準(zhǔn)確率隨之下降,即使增大數(shù)據(jù)集解決過擬合問題,也不會(huì)有所改善。ResNet網(wǎng)絡(luò)的提出解決了這個(gè)問題,其引入殘差網(wǎng)絡(luò)的設(shè)計(jì),采用shortcut的方式跳過輸入數(shù)據(jù)的卷積層操作,直接把輸入x加到輸出中,克服了網(wǎng)絡(luò)深度加深對(duì)模型訓(xùn)練梯度下降的不良影響。
殘差模塊的結(jié)構(gòu)設(shè)計(jì)如圖1所示。F(X)為X經(jīng)過權(quán)重層輸出的結(jié)果,即指的是殘差,而右側(cè)曲線Xidentity表示X本身跳過了權(quán)重層直接與F(X)進(jìn)行疊加,relu表示網(wǎng)絡(luò)激活函數(shù)。使用這種快捷徑的結(jié)構(gòu)能夠在進(jìn)行反向傳播的同時(shí)保證無衰減地傳遞信號(hào),因此即使增加網(wǎng)絡(luò)層數(shù),學(xué)習(xí)效率也很高。
圖1 ResNet殘差模塊結(jié)構(gòu)圖
ResNet網(wǎng)絡(luò)模型中最常用的是ResNet50,網(wǎng)絡(luò)結(jié)構(gòu)如圖2所示,包括49個(gè)卷積層和1個(gè)全連接層。其中,第一階段不包括殘差塊,CONV表示對(duì)輸入進(jìn)行卷積操作,Batch Norm表示正則化處理,ReLU表示激活函數(shù),MAXPOOL表示進(jìn)行最大池化計(jì)算。第二階段~第五階段包括殘差塊結(jié)構(gòu),圖塊CONV-BLOCK不會(huì)改變殘差塊的尺寸,只用于添加殘差塊的維度,而圖塊IDBLOCK則不改變殘差塊的維度。在ResNet50網(wǎng)絡(luò)結(jié)構(gòu)中,殘差塊都有3層卷積,那網(wǎng)絡(luò)總共有1+3×(3+4+6+3)=49個(gè)卷積層,加上最后的全連接層,總共是50層,這也是ResNet50名稱的由來[3]。通過使用16個(gè)殘差塊的堆疊構(gòu)建了深度達(dá)到50層的卷積神經(jīng)網(wǎng)絡(luò),再經(jīng)過AvgPOOL平均池化層輸出特征向量、Flatten平面化圖層降維處理,最后由全連接層FC對(duì)這個(gè)特征向量進(jìn)行計(jì)算并輸出類別概率。
圖2 ResNet50網(wǎng)絡(luò)模型圖
現(xiàn)有公開的數(shù)據(jù)集資源很匱乏,特定領(lǐng)域的數(shù)據(jù)集資源更稀缺。網(wǎng)上收集的現(xiàn)成魚類數(shù)據(jù)集數(shù)量和豐富性難以滿足模型訓(xùn)練的需要,通過人工拍照、網(wǎng)絡(luò)爬蟲方式獲取相關(guān)圖片,爬蟲通過Python腳本實(shí)現(xiàn),用關(guān)鍵詞搜索的方式在電商平臺(tái)、百度圖片爬取對(duì)應(yīng)的圖片。試驗(yàn)發(fā)現(xiàn),爬取圖片會(huì)出現(xiàn)圖名不對(duì)應(yīng)的情況,需要改變方式,從百科中更有針對(duì)性地獲取數(shù)據(jù),經(jīng)過人工審查、篩選和判斷歸集圖片,并采用尺度變換和內(nèi)容變換的方式對(duì)數(shù)據(jù)集進(jìn)行增強(qiáng)處理。
采用Python腳本實(shí)現(xiàn)圖像批處理功能,對(duì)存在尺度不一、格式不定等問題的魚類圖像進(jìn)行統(tǒng)一數(shù)據(jù)處理,完成對(duì)917個(gè)樣本進(jìn)行圖像采集和歸納的任務(wù),并對(duì)每張圖片進(jìn)行編號(hào)排目,歸置到對(duì)應(yīng)的30種類別文件目錄中,用于下一步的模型訓(xùn)練。
2.2.1 學(xué)習(xí)率
學(xué)習(xí)率是模型訓(xùn)練時(shí)可控、可調(diào)整的超參數(shù)之一,其作用是控制梯度下降的迭代步長(zhǎng)。如果學(xué)習(xí)率過大,就會(huì)造成損失梯度下降速度較快的問題,模型loss無法收斂;反之,學(xué)習(xí)率過小會(huì)導(dǎo)致模型收斂速度變慢,甚至?xí)萑刖植孔顑?yōu)的情況。最理想的結(jié)果是權(quán)衡兩者變化,損失梯度收斂較快又能下降到比較小的位置。在ResNet網(wǎng)絡(luò)的遷移學(xué)習(xí)中,通過凍結(jié)底層學(xué)習(xí)率調(diào)整新的全連接層學(xué)習(xí)率,經(jīng)過多次試驗(yàn)選擇最優(yōu)學(xué)習(xí)率。默認(rèn)的學(xué)習(xí)率設(shè)置都比較小,推薦參數(shù)一般為0.000 1,在該范圍擴(kuò)大或縮小數(shù)量級(jí)進(jìn)行測(cè)試,以選擇最優(yōu)值。
2.2.2 批尺寸
批尺寸是指單次訓(xùn)練所選取樣本的數(shù)量,其大小影響模型的優(yōu)化程度和速度。在合理范圍內(nèi)增大批尺寸能提高內(nèi)存利用率,減少單次訓(xùn)練中批數(shù)據(jù)的迭代次數(shù),梯度確定的下降方向就越準(zhǔn),但是盲目增大批尺寸會(huì)導(dǎo)致單次訓(xùn)練時(shí)間增加,參數(shù)的修正變得緩慢,超過某個(gè)臨界點(diǎn)還會(huì)導(dǎo)致模型泛化能力下降,而在該臨界點(diǎn)之下,模型性能隨批尺寸變化而變化的程度通常沒有學(xué)習(xí)率明顯??紤]該試驗(yàn)為CPU環(huán)境,設(shè)置批尺寸小于64為宜。
2.2.3 迭代次數(shù)
將所有樣本數(shù)據(jù)送入網(wǎng)絡(luò)完成1次前向計(jì)算以及反向傳播的過程稱為一個(gè)迭代,在實(shí)際模型訓(xùn)練時(shí),所有數(shù)據(jù)迭代訓(xùn)練1次是不夠的,往往需要經(jīng)過多次反復(fù)的迭代才能擬合收斂。神經(jīng)網(wǎng)絡(luò)模型的權(quán)重結(jié)構(gòu)會(huì)隨著迭代次數(shù)的增加而逐步更新,loss曲線從不擬合狀態(tài)逐漸進(jìn)入優(yōu)化擬合狀態(tài),如果迭代次數(shù)繼續(xù)增加,那么最終模型將進(jìn)入過擬合狀態(tài)。但迭代次數(shù)的選擇沒有一個(gè)確切的答案,不同的數(shù)據(jù)樣本有不同的迭代次數(shù),一般數(shù)據(jù)集的多樣化程度越高,迭代次數(shù)也應(yīng)該越多,合適的迭代次數(shù)能使模型訓(xùn)練達(dá)到更好的效果。綜合考慮樣本集數(shù)量(1 917個(gè))以及樣本種類(30種),迭代10次就可以大致收斂。
基于神經(jīng)網(wǎng)絡(luò)框架平臺(tái)PyTorch搭建ResNet網(wǎng)絡(luò)模型,根據(jù)ResNet中的殘差學(xué)習(xí)模塊的不同分別構(gòu)建BasicBlock(nn.Module)類和Bottleneck(nn.Module)類,逐層實(shí)現(xiàn)ResNet34、ResNet50以及ResNet101網(wǎng)絡(luò)結(jié)構(gòu),例如ResNet50網(wǎng)絡(luò)根據(jù)圖2的結(jié)構(gòu)模型逐層搭建,并通過宏定義的方式進(jìn)行網(wǎng)絡(luò)模型封裝,以方便模型訓(xùn)練時(shí)對(duì)該自定義模塊進(jìn)行調(diào)用。
該試驗(yàn)使用基于Python語言的深度學(xué)習(xí)神經(jīng)網(wǎng)絡(luò)框架平臺(tái)PyTorch,硬件環(huán)境為Intel(R) Core(TM) i5-4210M CPU @ 2.60GHz,Windows 1 064位家庭版21H2,編譯軟件為PyCharm2020社區(qū)版,基礎(chǔ)配置Anaconda 3,創(chuàng)建Python3.7版本虛擬環(huán)境,并在該解釋器下安裝了Open CV、TensorBoardX等依賴庫,以滿足試驗(yàn)的需要。
對(duì)基礎(chǔ)數(shù)據(jù)集進(jìn)行拆分,按照9∶1的比例分為訓(xùn)練集和驗(yàn)證集,級(jí)目錄結(jié)構(gòu)保持與基礎(chǔ)數(shù)據(jù)集一致,以方便后續(xù)模型的訓(xùn)練。其中,訓(xùn)練集1 739張,驗(yàn)證集178張,并且采取相同的預(yù)處理操作,保證驗(yàn)證和測(cè)試結(jié)果的準(zhǔn)確性。
神經(jīng)網(wǎng)絡(luò)中超參數(shù)的取值對(duì)模型的性能有很大的影響,試驗(yàn)中分類識(shí)別模型訓(xùn)練所使用的優(yōu)化器是Adam,綜合考慮硬件訓(xùn)練環(huán)境資源,設(shè)定學(xué)習(xí)率為固定的值0.000 1,批尺寸的數(shù)值設(shè)定為16,即每次批量讀取16張圖片,以交叉熵誤差函數(shù)(Cross Entropy Loss)作為損失函數(shù),在不占用太大計(jì)算資源的情況下,使模型可以快速收斂。
采用遷移學(xué)習(xí)機(jī)制,試驗(yàn)前下載3個(gè)預(yù)訓(xùn)練模型(ResNet34、ResNet50以及ResNet101),并分別構(gòu)建ResNet34、ResNet50以及ResNet101網(wǎng)絡(luò)模型,以相同的市場(chǎng)漁獲數(shù)據(jù)集進(jìn)行訓(xùn)練,訓(xùn)練周期設(shè)置為10,即1次試驗(yàn)迭代10輪,通過TensorBoardX繪制訓(xùn)練損失loss曲線以及驗(yàn)證的準(zhǔn)確率與loss曲線,觀察模型收斂情況,展示網(wǎng)絡(luò)模型在訓(xùn)練集和驗(yàn)證集上的識(shí)別效果。
ResNet中的殘差學(xué)習(xí)模塊有2種形式:1) Basicblock。用于層數(shù)較少的模型。2) Bottleneck。目的是減少參數(shù)量和計(jì)算量。ResNet50網(wǎng)絡(luò)就是模型分界,層數(shù)小于50的使用Basicblock,其余的網(wǎng)絡(luò)模型使用Bottleneck[4]。而ResNet50與ResNet101相比,唯一的不同在于網(wǎng)絡(luò)conv4_x,ResNet50有6個(gè)殘差模塊(block),而ResNet101有23個(gè)block[5]。
訓(xùn)練loss曲線如圖3所示。由圖3可知,ResNet34網(wǎng)絡(luò)較為簡(jiǎn)單,收斂速度快,在第三輪訓(xùn)練時(shí)基本就趨于穩(wěn)定了,而另外2個(gè)網(wǎng)絡(luò)模型則在第四輪之后才達(dá)到相近的loss值。從訓(xùn)練時(shí)間來看,3個(gè)ResNet網(wǎng)絡(luò)模型訓(xùn)練時(shí)長(zhǎng)分別為2.2 h、3.5 h和5.7 h,由此可知,網(wǎng)絡(luò)結(jié)構(gòu)和卷積網(wǎng)絡(luò)層數(shù)的增加對(duì)模型訓(xùn)練花費(fèi)的時(shí)間有較大的影響。
圖3 訓(xùn)練損失loss曲線
驗(yàn)證loss曲線以及準(zhǔn)確率如圖4所示。首先,對(duì)照準(zhǔn)確率acc曲線,在訓(xùn)練10輪后,3個(gè)模型的準(zhǔn)確率acc均達(dá)到0.9以上,ResNet34訓(xùn)練過程中曲線波動(dòng)較大,而另外2個(gè)模型訓(xùn)練過程較平穩(wěn)。其次,對(duì)照驗(yàn)證loss曲線,三者曲線loss值均降至0.4以下,對(duì)比之下,ResNet34的loss已趨于穩(wěn)定,而另外2個(gè)模型的loss值仍有下降的趨勢(shì),ResNet101網(wǎng)絡(luò)表現(xiàn)得更明顯。
圖4 驗(yàn)證loss曲線以及準(zhǔn)確率
對(duì)模型訓(xùn)練的學(xué)習(xí)率lr進(jìn)行微調(diào),將其設(shè)置為0.000 05和0.000 30,并沒有推薦參數(shù)0.000 10的效果好。另外,調(diào)整迭代次數(shù)批處理數(shù)量的大小對(duì)計(jì)算機(jī)的資源占用率影響較大,對(duì)模型的訓(xùn)練效果影響較小,這些現(xiàn)象也符合試驗(yàn)前的分析。
該試驗(yàn)以市場(chǎng)常見的30種漁獲物為對(duì)象,橫向?qū)Ρ萊esNet網(wǎng)絡(luò)模型的訓(xùn)練效果,綜合上述數(shù)據(jù)表現(xiàn),整體準(zhǔn)確率和loss收斂差別不大,都達(dá)到了較好的效果,在一般的使用場(chǎng)景下,ResNet50網(wǎng)絡(luò)模型可以符合使用需求。下一步打算豐富當(dāng)前的漁獲數(shù)據(jù)集,增加模型訓(xùn)練的迭代次數(shù),并將算法模型投入實(shí)際生產(chǎn)環(huán)境使用,以驗(yàn)證模型的精度與穩(wěn)定性。
中國(guó)新技術(shù)新產(chǎn)品2022年19期