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

評論