這篇文章介紹了作者在Kaggle植物幼苗分類比賽使用的方法,該方法連續(xù)幾個月排名第一,最終排名第五。該方法非常通用,也可以用于其他圖像識別任務(wù)。
任務(wù)概述
你能區(qū)分雜草和作物幼苗嗎?
有效做到這一點的能力意味著更高的作物產(chǎn)量和更好的環(huán)境管理。
奧爾胡斯大學(xué)信號處理小組與南丹麥大學(xué)合作發(fā)布了一個數(shù)據(jù)集,其中包含大約960種不同生長階段的植物的圖像,這些植物屬于12個物種。
樣本植物之一:繁縷樣本[3]
該數(shù)據(jù)集包含有標(biāo)注的RGB圖像,物理分辨率約為每毫米10個像素。
為了規(guī)范對數(shù)據(jù)集獲得的分類結(jié)果的評價,研究者提出了基于F1分?jǐn)?shù)的基準(zhǔn)。
下面的圖是數(shù)據(jù)集中所有12個類的樣本:
圖像分類任務(wù)可以分為5個步驟:
步驟1
機器學(xué)習(xí)中的第一個也是最重要的任務(wù)是在繼續(xù)使用任何算法之前對數(shù)據(jù)集進行分析。這對于理解數(shù)據(jù)集的復(fù)雜性非常重要,最終將有助于設(shè)計算法。
圖像和類的分布如下:
如前所述,共有12個類,4750張圖像。但是,從上面的圖中可以看出,數(shù)據(jù)的分布不均勻,類的分布從最大有654張圖像到最小只有221張圖像。這表明數(shù)據(jù)不均衡,數(shù)據(jù)需要均衡才能獲得最佳結(jié)果。我們將在第3個步驟講這一點。
每個類的圖像分布
為了更好地理解數(shù)據(jù),對圖像進行可視化非常重要。因此,每個類中會拿出一些示例圖像,以查看圖像之間的差異。
從上面的圖中得不到什么理解,因為所有的圖像看起來都差不多。因此,我決定使用被稱為t分布隨機鄰域嵌入(t-SNE)的可視化技術(shù)來查看圖像的分布。
t-SNE是降維的一種技術(shù),特別適用于高維數(shù)據(jù)集的可視化。該技術(shù)可以通過Barnes-Hut近似實現(xiàn),使其可以應(yīng)用于大型真實世界的數(shù)據(jù)集[14]。
數(shù)據(jù)集的t-SNE可視化
現(xiàn)在,仔細觀察后,我們幾乎看不出不同類之間的差異。數(shù)據(jù)的差異是只對人類來說很難區(qū)分,還是不管對人類還是對機器學(xué)習(xí)模型來說都很難區(qū)分,了解這一點很重要。因此,我們將做一個基本的benchmark。
訓(xùn)練集和驗證集
在開始使用模型基準(zhǔn)之前,我們需要將數(shù)據(jù)劃分為訓(xùn)練數(shù)據(jù)集和驗證數(shù)據(jù)集。在模型在原始測試集上進行測試之前,驗證集扮演測試數(shù)據(jù)集的角色。因此,基本上一個模型在訓(xùn)練數(shù)據(jù)集上進行訓(xùn)練,在驗證集上進行測試,然后在驗證集上對模型進行改進。當(dāng)我們對驗證集的結(jié)果滿意,我們就可以將模型應(yīng)用到真實測試數(shù)據(jù)集上。這樣,我們可以在驗證集上看到模型是過擬合還是欠擬合,從而幫助我們更好地擬合模型。
對有4750張圖像的這個數(shù)據(jù)集,我們將80%的圖像作為訓(xùn)練數(shù)據(jù)集,20%作為驗證集。
分開訓(xùn)練數(shù)據(jù)和驗證數(shù)據(jù)
步驟2
有了訓(xùn)練集和驗證集后,我們開始對數(shù)據(jù)集進行基準(zhǔn)測試。這是一個分類問題,在給出一個測試數(shù)據(jù)時,我們需要將它分到12個類中的一個。我們將使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)來完成這個任務(wù)。
創(chuàng)建CNN模型有幾種方法,但對于第一個基準(zhǔn),我們將使用Keras深度學(xué)習(xí)庫。我們將在Keras中使用現(xiàn)有的預(yù)訓(xùn)練好的模型,我們將對其進行微調(diào)以完成我們的任務(wù)。
從頭開始訓(xùn)練CNN是低效的。因此,我們使用一個在有1000個類的ImageNet上預(yù)訓(xùn)練的CNN模型的權(quán)重,通過凍結(jié)某些層,解凍其中一些層,并在其上進行訓(xùn)練,對其進行微調(diào)。這是因為頂層學(xué)習(xí)簡單的基本特征,我們不需要訓(xùn)練那些層,它們可以直接應(yīng)用到我們的任務(wù)中。需要注意的是,我們需要檢查我們的數(shù)據(jù)集是否與ImageNet相似,以及我們的數(shù)據(jù)集有多大。這兩個特性將決定我們?nèi)绾芜M行微調(diào)。
在這個例子中,數(shù)據(jù)集很小,但有點類似于ImageNet。因此,我們可以首先直接使用ImageNet的權(quán)重,只需添加一個包括12個類的最終輸出層,以查看第一個基準(zhǔn)。然后我們將解凍一些底部的層,并且只訓(xùn)練這些層。
我們將使用Keras作為初始基準(zhǔn),因為Keras提供了許多預(yù)訓(xùn)練模型。我們將使用ResNet50和InceptionResNetV2來完成我們的任務(wù)。使用一個簡單的模型和一個非常高的終端模型對數(shù)據(jù)集進行基準(zhǔn)測試是很重要的,可以了解我們是否在給定模型上過擬合/欠擬合數(shù)據(jù)集。
此外,我們可以在ImageNet數(shù)據(jù)集上檢查這些模型的性能,并檢查每個模型的參數(shù)數(shù)量,以選擇我們的基準(zhǔn)模型。
對于第一個基準(zhǔn)測試,我刪除了最后一個輸出層,只添加了一個帶有12個類的最終輸出層。此外,還打印了模型摘要和參數(shù)的數(shù)量,下面是最后幾層的截圖。
添加一個dense層以得到第一個基準(zhǔn)
模型運行了10個epochs,6個epochs后結(jié)果達到飽和。訓(xùn)練精度達到88%,驗證精度達到87%。
為了進一步提高性能,我們從底部解凍了一些層,并以指數(shù)衰減的學(xué)習(xí)率訓(xùn)練了更多的層。這個過程將精度提高了2%。
從底層開始訓(xùn)練幾層后的結(jié)果
此外,該過程中還使用了以下超參數(shù):
步驟3
準(zhǔn)備好基本的基準(zhǔn)后,就可以改進它了。我們可以從增加更多數(shù)據(jù)開始,增加數(shù)據(jù)集中圖像的數(shù)量。
沒有數(shù)據(jù),就沒有機器學(xué)習(xí)!
但首先這個數(shù)據(jù)集不均衡,需要進行均衡,以便每批都使用偶數(shù)個圖像作為模型的訓(xùn)練數(shù)據(jù)。
現(xiàn)實生活中的數(shù)據(jù)集從來都不是均衡的,模型在少數(shù)類上的性能也不是很好。因此,將少數(shù)類的樣本錯誤地歸類到正常類樣本的成本通常要比正常類錯誤的成本高得多。
我們可以用兩種方法來均衡數(shù)據(jù):
1.ADASYN采樣方法:
ADASYN為樣本較少的類生成合成數(shù)據(jù),其生成的數(shù)據(jù)與更容易學(xué)習(xí)的樣本相比,更難學(xué)習(xí)。
ADASYN的基本思想是根據(jù)學(xué)習(xí)難度的不同,對不同的少數(shù)類的樣本使用加權(quán)分布。其中,更難學(xué)習(xí)的少數(shù)類的樣本比那些更容易學(xué)習(xí)的少數(shù)類的樣本要產(chǎn)生更多的合成數(shù)據(jù)。因此,ADASYN方法通過以下兩種方式改善了數(shù)據(jù)分布的學(xué)習(xí):(1)減少由于類別不平衡帶來的偏差;(2)自適應(yīng)地將分類決策邊界轉(zhuǎn)移到困難的例子[5]。
2.合成少數(shù)類過采樣技術(shù)(SMOTE):
SMOTE涉及對少數(shù)類進行過采樣(over sampling),并對大多數(shù)類進行欠采樣(under sampling)以獲得最佳結(jié)果。
對少數(shù)(異常)類進行過采樣和對大多數(shù)(正常)類進行欠采樣的方法的組合,相比僅僅對大多數(shù)類進行欠采樣可以得到更好的分類器性能(在ROC空間中)。
對于這個用例,SMOTE的結(jié)果被證明更好,因此SMOTE比ADASYN更受歡迎。一旦數(shù)據(jù)集達到平衡,我們就可以繼續(xù)進行數(shù)據(jù)增強(data augmentation)。
有幾種方法可以實行數(shù)據(jù)增強。比較重要的一些是:
縮放
裁剪
翻轉(zhuǎn)
旋轉(zhuǎn)
平移
添加噪音
改變照明條件
先進的技術(shù),如GAN
已經(jīng)有一些很好的博客解釋了這些技術(shù)[8][9],所以本文不再詳細解釋。在這個任務(wù)中,除GAN外,以上所有數(shù)據(jù)增強技術(shù)都使用到。
步驟4
現(xiàn)在,為了進一步提高成績,我們使用了學(xué)習(xí)率,包括周期性學(xué)習(xí)率(cyclical learning rate)和熱重啟學(xué)習(xí)率(learning rate with warm restarts)。但在此之前,我們需要找到模型的最佳學(xué)習(xí)率。這是通過繪制學(xué)習(xí)率和損失函數(shù)之間的圖,來檢查損失從哪里開始減少。
學(xué)習(xí)率與損失的關(guān)系圖
在我們的例子中,1e-1看起來是一個完美的學(xué)習(xí)率。但是,隨著我們越來越接近全局最小值,我們希望采取更短的步驟。一種方法是學(xué)習(xí)率退火(learning rate annealing),但是我采用了熱重啟學(xué)習(xí)率,啟發(fā)自SGDR: Stochastic Gradient Descent with Warm Restarts[10]這篇論文。同時將優(yōu)化器從Adam改為SGD,實現(xiàn)SGDR。
現(xiàn)在,可以使用上述技術(shù)來訓(xùn)練多個架構(gòu),然后將結(jié)果合并在一起。這稱為模型融合(Model Ensemble),是流行的技術(shù)之一,但是計算量非常大。
因此,我決定使用一種稱為snapshot ensembling[12]的技術(shù),通過訓(xùn)練單個神經(jīng)網(wǎng)絡(luò),使其沿著優(yōu)化路徑收斂到多個局部最小值,并保存模型參數(shù),從而實現(xiàn)集成的目的。
一旦確定了學(xué)習(xí)率的方法,就可以考慮圖像的大小。我用64 * 64大小的圖像(微調(diào)了ImageNet)訓(xùn)練模型,解凍了一些層,應(yīng)用 cyclic learning rate和snapshot ensembling,采用模型的權(quán)重,改變圖片尺寸為299 * 299,再以64*64圖像的權(quán)重進行微調(diào),執(zhí)行snapshot ensembling和熱重啟學(xué)習(xí)率。
如果我們改變圖像大小,需要再次運行學(xué)習(xí)率vs損失函數(shù)以獲得最佳學(xué)習(xí)率。
步驟5
最后一步是將結(jié)果可視化,以檢查哪些類具有最佳性能,哪些表現(xiàn)最差,并且可以采取必要的步驟來改進結(jié)果。
理解結(jié)果的一個很好的方法是構(gòu)造一個混淆矩陣(confusion matrix)。
在機器學(xué)習(xí)領(lǐng)域,特別是統(tǒng)計分類問題中,混淆矩陣(也稱為誤差矩陣)是一種特定的表格布局,能夠可視化算法的性能,通常是監(jiān)督學(xué)習(xí)(在無監(jiān)督學(xué)習(xí)中通常稱為匹配矩陣)。矩陣的每一行表示預(yù)測類中的實例,而每列表示實際類中的實例(反之亦然)。這個名字源于這樣一個事實:它可以很容易地看出系統(tǒng)是否混淆了兩個類別。
真實類vs在混淆矩陣中預(yù)測類
我們可以從混亂矩陣中看出模型預(yù)測標(biāo)簽與真實標(biāo)簽不同的所有類,我們可以采取措施來改進它。我們可以做更多的數(shù)據(jù)增強來嘗試讓模型學(xué)習(xí)這個類。
最后,將驗證集合并到訓(xùn)練數(shù)據(jù)中,利用所獲得的超參數(shù)對模型進行最后一次訓(xùn)練,并在最終提交之前對測試數(shù)據(jù)集進行評估。
最終提交后排名第一
注意:在訓(xùn)練中使用的增強需要出現(xiàn)在測試數(shù)據(jù)集中,以獲得最佳結(jié)果。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4812瀏覽量
103221 -
圖像分類
+關(guān)注
關(guān)注
0文章
96瀏覽量
12139 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1223瀏覽量
25368
原文標(biāo)題:從0上手Kaggle圖像分類挑戰(zhàn):冠軍解決方案詳解
文章出處:【微信號:AI_era,微信公眾號:新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
一種新的圖像定位和分類系統(tǒng)實現(xiàn)方案
基于Brushlet和RBF網(wǎng)絡(luò)的SAR圖像分類
一種基于Web挖掘的音樂流派分類方法
一種改進的小波變換圖像壓縮方法
一種具有反饋機制的名片信息分類方法

一種Spark高光譜遙感圖像稀疏表分類并行化方法

基于數(shù)據(jù)挖掘的醫(yī)學(xué)圖像分類方法
一種旋正圖像使用中心點進行指紋分類的方法

一種堅固特征級融合和決策級融合的分類方法

一種基于人臉圖像陰影集的二級分類模型

一種全新的遙感圖像描述生成方法

評論