眾所周知,Kaggle 是一個進(jìn)行預(yù)測建模及數(shù)據(jù)分析的競賽平臺。在這個平臺上,統(tǒng)計學(xué)家和數(shù)據(jù)科學(xué)家競相構(gòu)建最佳的模型,這些模型被用于預(yù)測、描述公司和用戶上傳的數(shù)據(jù)集。這種眾包的方式之所以被廣為接受,是因為對于同一個預(yù)測建模任務(wù)來說,可能存在無數(shù)種解決策略,但是想要事先知道哪種技術(shù)或分析方法是最有效的幾乎不可能。[1]
任務(wù)概述
你能分清雜草和農(nóng)作物幼苗嗎?
如果我們能高效地區(qū)分農(nóng)作物幼苗和雜草,那么就可以提升農(nóng)作物的產(chǎn)量,更好地管理環(huán)境中的雜草。
Aarhus 大學(xué)信號處理研究小組與南丹麥大學(xué)合作,發(fā)布了一個用于該任務(wù)的數(shù)據(jù)包,其中包括處于不同生長階段的 12 個物種(共計 960 種植物)的圖像。[1][2]
植物樣本之一:「繁縷」樣本
這個公開的數(shù)據(jù)庫由注釋的 RGB 圖像組成,其物理分辨率大約為每毫米 10 像素。
為了對使用該數(shù)據(jù)庫得到的分類結(jié)果進(jìn)行標(biāo)準(zhǔn)化評估,組織者提供了基于 F1 值的對比基準(zhǔn),你可以通過如下鏈接獲得這個數(shù)據(jù)集:https://vision.eng.au.dk/plant-seedlings-dataset/。[13]
下圖是一個表示了該數(shù)據(jù)集中 12 類植物的樣本:
圖片來源:https://vision.eng.au.dk/plant-seedlings-dataset/
下面為大家介紹這一圖像分類任務(wù),該任務(wù)可以分為五個步驟
第一步:
在大多數(shù)機器學(xué)習(xí)任務(wù)中,我們首先要做的(也是最重要的任務(wù))就是在使用算法之前分析數(shù)據(jù)集。這一步驟之所以重要,是因為它能夠讓我們對數(shù)據(jù)集的復(fù)雜度有深入的了解,這最終將有助于算法的設(shè)計。
圖像和類別的分布情況如下:
正如文中所提到的,該數(shù)據(jù)集共包含 4750 張從屬于 12 個類別的植物圖片。然而,如上圖所示,這種分布是不均勻的,各種類別的植物分布從最多 654 張圖像到最少 221 張圖像。很顯然數(shù)據(jù)是不平衡的,我們需要對數(shù)據(jù)進(jìn)行平衡處理,以便獲得最佳的分類效果。本文將在第三步中討論這個問題。
每個類的圖像分布
為了更好地理解數(shù)據(jù),對圖像進(jìn)行可視化處理十分重要。因此,我們將每類植物的示例圖片展示了出來,以便看到圖像之間的差異。
上面這些圖片看上去實在太像了,以至于我們不能直接看出什么信息。因此,我決定使用 t 分布隨機鄰域嵌入(https://lvdmaaten.github.io/tsne/)可視化技術(shù)來查看圖片的分布。
t 分布隨機鄰域嵌入(t—SNE)是一種特別適合對高維數(shù)據(jù)集進(jìn)行可視化的降維技術(shù)。這種技術(shù)可以通過「Barnes-Hut」近似算法來實現(xiàn),這使得它能夠被應(yīng)用于大型的真實數(shù)據(jù)集。[14]
數(shù)據(jù)集的t-SNE可視化結(jié)果
仔細(xì)觀察之后,我們幾乎看不出類別之間的區(qū)別。因此,知道僅僅是人類難以區(qū)分這個數(shù)據(jù),還是機器學(xué)習(xí)模型也很難區(qū)分這個數(shù)據(jù)很重要。所以,我們將為此做一個基本的對比基準(zhǔn)。
訓(xùn)練集和驗證集
在開始建立模型的對比基準(zhǔn)前,我們需要將數(shù)據(jù)劃分為訓(xùn)練數(shù)據(jù)集和驗證數(shù)據(jù)集。在原始測試集上測試模型之前,驗證集起到了測試數(shù)據(jù)集的作用。所以,一個模型基本上是在訓(xùn)練數(shù)據(jù)集上進(jìn)行訓(xùn)練,在驗證集上進(jìn)行測試,隨著時間的推移,模型在驗證集上的性能將會提升。
一旦我們對驗證集上的測試結(jié)果感到滿意,我們就可以在真實的測試集上應(yīng)用該模型。通過這種方式,可以看出模型是否在驗證集上發(fā)生欠擬合或過擬合現(xiàn)象,這可以幫助我們更好地擬合模型。
我們將包含 4750 張圖片的數(shù)據(jù)集的 80% 作為訓(xùn)練集,另外 20% 作為驗證集。
訓(xùn)練集和驗證集的劃分
第二步:
當(dāng)獲得了訓(xùn)練集和驗證集之后,我們將開始使用數(shù)據(jù)集的對比基準(zhǔn)。正如所見,這是一個分類問題:給定測試集,我們需要將圖片歸類到 12 個類別中的某一類。我們將使用卷積神經(jīng)網(wǎng)絡(luò)(CNN)來完成這項任務(wù)。
「如果你是一位初學(xué)者,需要對深度學(xué)習(xí)術(shù)語有更深的了解,請訪問如下博客:https://medium.com/@shridhar743/a-beginners-guide-to-deep-learning-5ee814cf7706」
事實上,有許多方法可以創(chuàng)建卷積神經(jīng)網(wǎng)絡(luò)(CNN)模型,我們將使用 Keras 深度學(xué)習(xí)程序庫來實現(xiàn)第一個對比基準(zhǔn)。我們還將使用 Keras 中提供的預(yù)訓(xùn)練好的模型,這些模型已經(jīng)利用 ImageNet 數(shù)據(jù)集訓(xùn)練過,我們將對其進(jìn)行調(diào)優(yōu)以滿足任務(wù)需求。
從頭開始訓(xùn)練一個卷積神經(jīng)網(wǎng)絡(luò)(CNN)的效率相當(dāng)?shù)拖拢覀儗⒗迷诎?1000 類圖像的 ImageNet 上預(yù)訓(xùn)練好的卷積神經(jīng)網(wǎng)絡(luò)(CNN)的權(quán)重,然后通過將某些層保持為「凍結(jié)」?fàn)顟B(tài),再將一些層解凍并進(jìn)行訓(xùn)練,從而進(jìn)行調(diào)優(yōu)。這是因為,最上面的層學(xué)習(xí)到簡單的基本特征,而我們不需要對其進(jìn)行訓(xùn)練,可以直接將它們應(yīng)用到我們的任務(wù)中。需要注意的一點是,我們要檢查數(shù)據(jù)集是否與 ImageNet 類似,以及我們的數(shù)據(jù)集規(guī)模有多大。這兩個特征將決定我們?nèi)绾芜M(jìn)行調(diào)優(yōu)。如果你想了解更多的細(xì)節(jié),請參閱 Andrej Karpathy 的博客(https://medium.com/@karpathy)。
在植物幼苗檢測比賽的環(huán)境下,數(shù)據(jù)集規(guī)模很小,但是與 ImageNet 有些相似之處。因此,我們可以首先直接使用 ImageNet 的權(quán)重,僅僅在對比基準(zhǔn)的基礎(chǔ)上添加一個能夠?qū)?12 個類進(jìn)行分類的最終輸出層。接著,我們將逐漸解凍一些模型底部的層,并僅僅對這些解凍的層進(jìn)行訓(xùn)練。
由于 Keras 庫提供了大量預(yù)訓(xùn)練好的模型,我們采用 Keras 為對比基準(zhǔn)進(jìn)行初始化。具體而言,我們將使用 ResNet50 和 InceptionResNetV2 這兩個模型。很重要的是,我們需要用一個簡單模型和一個非常高端的模型對數(shù)據(jù)集進(jìn)行基準(zhǔn)測試,以便發(fā)現(xiàn)給定模型是否產(chǎn)生了欠擬合和過擬合。
Keras 庫提供的在 ImageNet 上預(yù)訓(xùn)練好的模型
圖片來源:https://keras.io/applications/
此外,我們還可以檢測這些模型在 ImageNet 數(shù)據(jù)集上的性能,查看 Keras 中每個模型(https://keras.io/applications/)的參數(shù)個數(shù),從而選擇對比基準(zhǔn)模型。
圖片來源:https://keras.io/applications/
在第一個基準(zhǔn)測試中,我刪除了最后的輸出層,并添加了一個能夠?qū)?12 個類別進(jìn)行分類的最終輸出層。此外,我將總結(jié)出的模型運行結(jié)果和參數(shù)的個數(shù)打印了出來,下圖是最后幾層網(wǎng)絡(luò)的信息截圖:
我在模型的最后添加了一個全連接層,構(gòu)建了第一個對比基準(zhǔn)
我共將該模型運行了 10 輪,而實驗結(jié)果在第 6 輪之后就飽和了。訓(xùn)練的準(zhǔn)確率為 88%,驗證的準(zhǔn)確率則為87%。
為了進(jìn)一步提升模型的性能,我們解凍了一些模型底部的層,并且令其學(xué)習(xí)率呈指數(shù)形式遞減,像這樣,我們訓(xùn)練了更多的層。這個操作使模型性能提高了 2%。
訓(xùn)練了模型底部幾層之后得到的實驗結(jié)果
此外,在這個過程中,我們使用的超參數(shù)總結(jié)如下:
第三步:
一旦準(zhǔn)備好了對比基準(zhǔn),我們就需要開始對其進(jìn)行改進(jìn)。首先,我們可以進(jìn)行數(shù)據(jù)增強處理,增加數(shù)據(jù)集中的圖像數(shù)。
沒有數(shù)據(jù),就沒有機器學(xué)習(xí)!
但是正如上文所述,我們得到的數(shù)據(jù)集是不平衡的,我們需要對其進(jìn)行平衡化處理,從而使用于訓(xùn)練模型的每一批的數(shù)據(jù)中都有均勻分布的 12 類圖像。
現(xiàn)實生活中的數(shù)據(jù)集往往都是不平衡的,而模型在樣本數(shù)量較少的類別上的性能并不太好。所以,將一個具有少數(shù)樣本的類誤分類為一個樣本數(shù)量較多的類的成本通常要比將數(shù)量較多的類誤分類高得多。
由此,我們嘗試使用兩種方法來平衡數(shù)據(jù):
針對不平衡學(xué)習(xí)的自適應(yīng)樣本合成方法(ADASYN):ADASYN 為樣本較少的類生成合成的數(shù)據(jù),這種方法會生成更多較難學(xué)習(xí)的數(shù)據(jù)集樣本。
ADASYN 的核心思想是,根據(jù)學(xué)習(xí)的困難程度,對樣本數(shù)少的類別實例使用加權(quán)分布。ADASYN 通過兩種方法提高了對數(shù)據(jù)分布的學(xué)習(xí)效果:(1)減少類別的不平衡所帶來的偏差。(2)自適應(yīng)地將分類的決策邊界轉(zhuǎn)換為更困難的樣本。[5]
少數(shù)類過采樣技術(shù)(SMOTE):SMOTE 包括對少數(shù)類的過采樣和多數(shù)類的欠采樣,從而得到最佳抽樣結(jié)果。
我們對少數(shù)(異常)類進(jìn)行過采樣并對多數(shù)(正常)類進(jìn)行欠采樣的做法可以得到比僅僅對多數(shù)類進(jìn)行欠采樣更好的分類性能(在 ROC 空間中)。[6]
重抽樣結(jié)果示意圖[7]
在此用例中,可以證明 SMOTE 算法的結(jié)果更好,因此 SMOTE 的性能優(yōu)于 ADASYN 算法。當(dāng)數(shù)據(jù)集處于平衡狀態(tài)后,我們就可以繼續(xù)進(jìn)行數(shù)據(jù)增強工作。
我們可以通過許多途徑實現(xiàn)數(shù)據(jù)增強,其中最重要的一些方法如下:
縮放
裁剪
反轉(zhuǎn)
旋轉(zhuǎn)
平移
加入噪音
改變光照條件
使用 GAN 這樣的先進(jìn)技術(shù)
第四步:
接下來,我們將進(jìn)一步提升模型結(jié)果。在這里,我們將對學(xué)習(xí)率進(jìn)行優(yōu)化,這里涉及到周期性學(xué)習(xí)率(cyclical learning rate)和帶熱重啟的學(xué)習(xí)率(learning rate with warm restarts)技術(shù)。在此之前,我們需要為模型找到可能的最佳學(xué)習(xí)率。這是通過繪制學(xué)習(xí)率和損失函數(shù)的關(guān)系圖來實現(xiàn)的,這一圖像用來查看損失函數(shù)值從哪里開始下降。
本文描述了一種設(shè)定學(xué)習(xí)率的新方法——周期性學(xué)習(xí)率,它實際上讓我們不必再通過大量實驗找到全局學(xué)習(xí)率的最優(yōu)值和最佳學(xué)習(xí)計劃。這種方法并不是單調(diào)地減小學(xué)習(xí)率,而是讓學(xué)習(xí)率周期性地在合理的邊界值之間變化。利用周期性學(xué)習(xí)率代替固定的學(xué)習(xí)率進(jìn)行訓(xùn)練,能夠有效地在不用進(jìn)行調(diào)優(yōu)的情況下提升分類準(zhǔn)確率,需要的迭代次數(shù)往往也更少。[11]
學(xué)習(xí)率和損失函數(shù)的關(guān)系示意圖
如上圖所示,0.1 看上去似乎是一個不錯的學(xué)習(xí)率。但是隨著越來越接近全局最小值,我們希望用更小的步長對最佳學(xué)習(xí)率進(jìn)行探索。「學(xué)習(xí)率退火」是一種實現(xiàn)這種操作的方法,受到這篇論文(https://arxiv.org/pdf/1608.03983.pdf)的影響,我選擇使用帶熱重啟的學(xué)習(xí)率。同時,我們將優(yōu)化器從 Adam 變?yōu)殡S機梯度下降(SGD),實現(xiàn)了帶重啟策略的隨機梯度下降(SGDR)。
接下來,我們可以使用上述技術(shù)訓(xùn)練一些模型架構(gòu),然后將這些模型得到的結(jié)果進(jìn)行合并。這也就是所謂的模型集成,如今它已經(jīng)成為一種流行技術(shù),但是這種技術(shù)也將帶來高昂的計算開銷。
因此,我決定使用一種名為快照集成(snapshot ensembling)的技術(shù),通過訓(xùn)練一個單一神經(jīng)網(wǎng)絡(luò)來達(dá)到集成目的,并且沿著優(yōu)化路徑收斂到幾個局部最小值,最終將模型參數(shù)保存下來。
左圖:使用傳統(tǒng)學(xué)習(xí)率計劃的隨機梯度下降優(yōu)化示意圖。在訓(xùn)練結(jié)束時,模型收斂到一個最小值處
右圖:快照集成示意圖。模型經(jīng)歷了幾個學(xué)習(xí)率退火周期,在從多個局部最小值中逃離出來后,收斂到某最小值處。我們?yōu)闇y試時集成的每一個最小值建立了一個快照。
圖片來源:https://arxiv.org/abs/1704.00109
當(dāng)學(xué)習(xí)率被固定下來后,我開始調(diào)整圖像的大小。我訓(xùn)練了一個針對于 64*64 圖像大小的模型(在 ImageNet 上對其進(jìn)行調(diào)優(yōu)),解凍某些層,對其應(yīng)用周期性學(xué)習(xí)率和快照集成技術(shù),獲得該模型的權(quán)重。將圖像的尺寸改為 299*299,并且再次利用圖像大小為 64*64 的權(quán)重對其進(jìn)行調(diào)優(yōu),并采用快照集成技術(shù)和帶熱重啟的學(xué)習(xí)率。
如果改變圖像的大小,需要再次采用周期性學(xué)習(xí)率、快照集成、熱重啟等技術(shù)尋找學(xué)習(xí)率和損失函數(shù)之間的關(guān)系,獲得最佳學(xué)習(xí)率。
第五步:
在最后一步,我們將對結(jié)果進(jìn)行可視化,看看模型對哪個類別的預(yù)測結(jié)果最好、對哪個類別的預(yù)測結(jié)果最差,并且我們還可以采取必要的措施進(jìn)一步改進(jìn)結(jié)果。
構(gòu)造一個混淆矩陣是理解模型結(jié)果的好方法。
在機器學(xué)習(xí)領(lǐng)域,特別是統(tǒng)計分類問題中,混淆矩陣(也稱為誤差矩陣)是一個特定的表格,它能夠?qū)⑺惴ǖ男阅芸梢暬?,這種算法通常是監(jiān)督學(xué)習(xí)算法,在非監(jiān)督學(xué)習(xí)領(lǐng)域它通常被稱為匹配矩陣。矩陣中的每一行代表預(yù)測類別中的一個實例,而每一列則代表真實類別中的一個實例(反之亦然)。這個矩陣之所以被稱為「混淆矩陣」,是因為它能夠讓人很容易地看到系統(tǒng)是否混淆了兩個類(即通常將一個類錯誤標(biāo)記為另一個類)。
混淆矩陣中真正的類別和預(yù)測出的類別
從混淆矩陣中我們可以看到所有的模型預(yù)測類別和真實類別不符的情況,我們可以采取措施去改進(jìn)模型。例如,可以做更多的數(shù)據(jù)增強工作,試著讓模型更好地學(xué)習(xí)到分類規(guī)則。
最后,我們將驗證集與訓(xùn)練數(shù)據(jù)合并,并通過已經(jīng)得到的超參數(shù),對模型進(jìn)行最后一次訓(xùn)練,在最終提交結(jié)果之前對測試數(shù)據(jù)集進(jìn)行評估。
本文模型在最終提交后名列第一
請注意:訓(xùn)練中使用的數(shù)據(jù)增強結(jié)果需要在測試集中顯示出來,以獲得可能得到的最佳結(jié)果。
-
圖像分類
+關(guān)注
關(guān)注
0文章
93瀏覽量
12002 -
機器學(xué)習(xí)
+關(guān)注
關(guān)注
66文章
8460瀏覽量
133420 -
數(shù)據(jù)集
+關(guān)注
關(guān)注
4文章
1212瀏覽量
24998
原文標(biāo)題:圖像分類比賽中,你可以用如下方案舉一反三
文章出處:【微信號:worldofai,微信公眾號:worldofai】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
電源產(chǎn)品設(shè)計總是很難?教你輕松舉一反三
[推薦學(xué)技術(shù)一定要懂得觸類旁通,舉一反三
2012年參加電子類比賽所獲榮譽小顯擺一下嘻嘻
舉一反三打一數(shù)字,***
一個類比解釋反激式電源原理
一種新的圖像定位和分類系統(tǒng)實現(xiàn)方案
圖像其實是一種波,可以用波的算法處理圖像
一個類比解釋反激式電源原理資料下載

評論