謝生鋒
(河南工學(xué)院計算機科學(xué)與技術(shù)學(xué)院,新鄉(xiāng) 453003)
遷移學(xué)習(xí)是一種機器學(xué)習(xí)方法,它是將已經(jīng)學(xué)習(xí)過的知識遷移應(yīng)用于新的問題中,用于提高解決新問題的速度和能力。卷積神經(jīng)網(wǎng)絡(luò)CNN使用卷積運算提取圖像的特征,從而實現(xiàn)對圖像的分類和識別,在CNN 的發(fā)展過程中出現(xiàn)了許多經(jīng)典的網(wǎng)絡(luò)模型,如AlexNet、GoogLeNet、VGGNet、ResNet 和Xception 等[1]。這些網(wǎng)絡(luò)模型是在包含超過1400萬張有標(biāo)記圖片的ImageNet數(shù)據(jù)集訓(xùn)練出來的,所以當(dāng)需要訓(xùn)練一個新的圖像分類任務(wù)時,使用這些網(wǎng)絡(luò)模型作為預(yù)訓(xùn)練模型,然后在訓(xùn)練好的卷積基的基礎(chǔ)上建立分類器。
Xception 是Google 繼Inception 后提出的InceptionV3 的一種改進模型,主要采用深度可分離卷積替代InceptionV3 中的卷積操作,將通道維度和空間維度的處理分開,達到解耦的效果。Xception 模型先用1 × 1 卷積處理通道維度之間的信息,再用3 × 3 卷積處理每一個通道維度內(nèi)的空間維度信息。Xception 網(wǎng)絡(luò)結(jié)構(gòu)是由36 個卷積層組成網(wǎng)絡(luò)的特征提取基礎(chǔ),這些卷積層被分成14個模塊,除了首尾模塊,其余模塊用線性殘差連接[2],其網(wǎng)絡(luò)結(jié)構(gòu)如圖1所示。
基于上述Xception 網(wǎng)絡(luò)模型的特點,其在ImageNet 數(shù)據(jù)集上訓(xùn)練的準(zhǔn)確率有明顯提高,參數(shù)量有所下降,同時引入了殘差連接機制也加快了Xception 的收斂過程。本文采用Xception網(wǎng)絡(luò)模型作為預(yù)訓(xùn)練模型,對貓狗圖像進行分類識別。
數(shù)據(jù)來源于Kaggle競賽平臺上的dogs-vs-cats數(shù)據(jù)集,該數(shù)據(jù)集由標(biāo)記為cat 和dog 的25000張圖片和未標(biāo)記的圖片組成,其中有標(biāo)記的貓和狗的圖片各占12500張。本文從有標(biāo)記的圖片中隨機抽取5000 張圖片來構(gòu)建數(shù)據(jù)集,將數(shù)據(jù)集劃分為訓(xùn)練集、驗證集和測試集三部分,圖片數(shù)量分別是3000張、1000張和1000張,并且每一個數(shù)據(jù)集中的貓和狗的圖片數(shù)量相等。劃分后的訓(xùn)練集中的圖片如圖2所示。
圖1 Xception模型結(jié)構(gòu)圖
圖2 訓(xùn)練集圖片
由于Xception 模型要求的圖片大小是229像素×229像素,包含的三個通道分別是R、G、B。所以先把三個數(shù)據(jù)集中的圖片維度處理為(229,229,3),使用Keras 框架中的圖片生成器ImageDataGenerator 對訓(xùn)練集中的圖片做數(shù)據(jù)增強,它是對圖片進行旋轉(zhuǎn)、平移、縮放、反轉(zhuǎn)、剪切和歸一化等操作,歸一化是把像素值縮小到(0,1)范圍內(nèi)[3]。通過數(shù)據(jù)增強可以擴充數(shù)據(jù)集大小,增強模型的泛化能力,而對驗證集和測試集中的圖片只做歸一化處理,訓(xùn)練集和驗證集每個批次生成圖片的數(shù)量分別設(shè)置成30 和20,同時把文本類標(biāo)簽cat 和dog 編碼為數(shù)值,分別是0和1。
采用Xception 模型作為預(yù)訓(xùn)練模型,首先刪除Xception 模型的最后一個模塊,即刪除Dense 層和GlobalAveragePooling 兩層,同時對Xception 模型進行微調(diào),解凍block14 模塊,包括兩個SeparableConv2D 層、兩個BatchNormalization 層,兩個Activation 層,使這六層變?yōu)榭捎?xùn)練狀態(tài),它們的權(quán)重在訓(xùn)練模型的每個周期中被更新[4],block14模塊的結(jié)構(gòu)如圖3所示。
圖3 block14模塊的結(jié)構(gòu)圖
在block14 模塊的基礎(chǔ)上構(gòu)建圖像分類器,使用GlobalAveragePooling2D 對圖像數(shù)據(jù)進行扁平化處理,得到的一維數(shù)據(jù)作為Dense層的輸入數(shù)據(jù),激活函數(shù)是ReLU;再使用Dropout層抑制過擬合;最后使用Dense 層進行二分類,激活函數(shù)是Sigmoid。圖像分類器的結(jié)構(gòu)如圖4所示。
圖4 圖像分類器的結(jié)構(gòu)圖
使用模型的fit_generator 函數(shù)在數(shù)據(jù)生成器上進行訓(xùn)練,分批次讀取數(shù)據(jù)增強后的圖片數(shù)據(jù),模型迭代訓(xùn)練50 次。設(shè)置訓(xùn)練集的一次訓(xùn)練包含的步數(shù)是100,每一步生成30個圖片數(shù)據(jù)參與訓(xùn)練,驗證集的一次訓(xùn)練包含的步數(shù)是50,每一步生成20 個圖片數(shù)據(jù)參與訓(xùn)練。模型的損失函數(shù)和準(zhǔn)確率分別采用binary_crossentropy 和accuracy來評估[5]。
經(jīng)過訓(xùn)練后模型的準(zhǔn)確率如圖5所示,可以看出,驗證集的準(zhǔn)確率為98.9%。模型的損失值如圖6所示,驗證集的損失曲線是逐漸下降并趨于收斂。
圖5 模型準(zhǔn)確率變化曲線
圖6 模型損失變化曲線
訓(xùn)練后的模型以h5格式保存到硬盤中,并對測試集的1000張圖片進行測試,調(diào)用evaluate()函數(shù)輸出準(zhǔn)確率以對模型進行評估,程序運行結(jié)果表明,測試集上的準(zhǔn)確率達到99.2%,損失值是0.0219。最后調(diào)用roc_curve()函數(shù)生成ROC 曲線,如圖7所示。從圖7看出,曲線下方的面積接近于1,表明模型的分類效果好。
圖7 ROC曲線圖
本文使用遷移學(xué)習(xí)將Xception 模型作為預(yù)訓(xùn)練模型,并對其中的block14 模塊進行微調(diào),使其中的六層處于可訓(xùn)練狀態(tài),在此基礎(chǔ)上構(gòu)建圖像分類器,把5000 張貓狗圖片分為訓(xùn)練集、驗證集和測試集,通過訓(xùn)練集得到模型的權(quán)重,該模型在驗證集和測試集上的準(zhǔn)確率分別達到了98.9%和99.2%,證明了該模型對貓狗圖片的分類效果好。