當前位置:
首頁 > 新聞 > 我贏得 Kaggle 競賽的第五名,這些經驗分享給你

我贏得 Kaggle 競賽的第五名,這些經驗分享給你

雷鋒網按:本文為AI研習社編譯的技術博客,原標題 Kaggle #1 Winning Approach for Image Classification Challenge,作者為 Kumar Shridhar 。

翻譯 |  京鵬  張小恬  蔣華烈  程磊       校對 |  餘杭       整理 | MY

植物幼苗分類比賽冠軍

這篇文章記錄了我參加 Kaggle植物幼苗分類比賽所採用的方法。我曾連續幾個月佔據榜首,並最終名列第五。這些方法通用性很好,可以應用到其他的圖片分類任務中。

任務概覽

你能從作物幼苗中區分出雜草嗎?

有效的解決方案意味著更好的作物產量及更好的環境管理。

奧胡斯大學信號處理組與丹麥南方大學合作,發布了一個數據集,其中包含不同生長階段的 12 個種類大約 960 種植物的圖像 [1] [2]。

植物樣本之一:繁縷 [3]

上述圖像資料庫已公開發布。它包含帶注釋的 RGB 圖像,解析度約為每毫米 10 個像素。

採用基於 F1 分數的指標對分類結果進行評估。數據集鏈接在URL里 [13]

以下圖像是描述數據集中所有 12 個類的示例:

圖片分類任務包含以下5個步驟:

步驟 1:

機器學習中的首要任務是分析數據集,然後才能進行任意演算法。為了解數據集的複雜性,這一步很重要,這最終將有助於該演算法設計。

圖像和類的分布如下:

如上所述,此包含 12 個類共 4750 個圖像。但是,以上可以看出,各類值分布不平均,圖像類數值分布從最大 654 張到最小的 221 幅不等。這清楚地表明數據是不平均的,但為獲得最好的結果我們需要權衡數據。步驟 3 中我們將達成此任務。

每類的圖像分布

現在對圖像進行可視化十分重要,以便能更好了解數據。因此,我們將展示每個類中的部分示例,查看圖像的不同之處。

所有的圖像看起來都相差無幾,幾乎沒有什麼內容可以從上面的圖像群中獲得。因此,我決定使用一個稱為 t 分布隨機鄰域嵌入(t. SNE)的可視化技術觀察圖像分布。

t 分布隨機鄰域嵌入(t. SNE)是一種特別適合於高維數據集的可視化降維技術。該技術可以通過巴恩斯-小屋逼近模型實現,這允許該技術應用於現實世界的大型數據集。[14]

數據集的 t-SNE 可視化

在仔細觀察後,我們幾乎看不出各類間差異。所以,掌握是僅僅對人類而言這些數據是難以分辨的,還是對於機器學習模型同樣如此十分重要。為此,我們將為它做一個基本的基準。

訓練以及驗證集合

在模型基準開始之前我們需要將數據劃分為訓練數據和驗證數據集,對原始測試集進行測試之前驗證集起到測試數據集作用。所以,模型基本上在訓練數據集上進行實驗,並在驗證集上進行了測試,之後模型隨著集合的多次驗證得以改進。一旦我們對驗證集的結果感到滿意,就可將模型應用於實際測試數據。我們能夠以此看到模型在我們的驗證集上為超擬合或是欠擬合,這可以幫助我們更好地調整模型。

我們通過保持 80% 圖像作為訓練數據集及 20% 作為驗證集來劃分 4750 圖像的數據集。

訓練和驗證數據拆分

步驟 2:

一旦我們得到了訓練集和驗證集,我們就從數據集的基準開始著手。這是一個建立在測試集上的一個分類問題,我們需要把測試集中的每一個實例劃分為 12 類中的一類。所以我們將會用一個卷積神經網路(CNN)去完成這個任務。

有很多途徑去創建一個 CNN 模型, 但是作為初學者, 我們最好使用 Keras 深度學習庫. 我們也將使用 Keras 上提供的預訓練模型, 這些模型是在 ImageNet 數據集上訓練過的並且我們可以通過微調這些模型以用於我們這裡的任務。

從頭開始去訓練卷積神經網路實際上是非常低效的。所以,我們採用在有著 1000 類的 ImageNet 數據集上預訓練過的 CNN 模型參數,並且在微調時,我們固定住一些層的參數,其他層的參數繼續在我們這裡的數據集上繼續訓練。這樣做的原因是因為比較前面的一些層是用來學習圖像的基本特徵的,我們沒有必要去訓練並且可以直接在我們的任務里直接採用。一個值得我們注意的重要事情是,我們要去檢查我們這裡的數據集跟 ImageNet 相似性如何以及有多大。這兩個數據集的特性決定了我們該如何進行網路微調。想要獲取關於網路微調的詳細資料,請參考Andrej Karpathy的博客:

對於我們這裡的例子,數據集是很小的,並且還跟 ImageNet 有點相似。所以我們首先直接用 ImageNet 上的權重,並加上有著 12 個類別的最終輸出層來構建我們的第一個基準程序。接著,我們去把一些後面的層給「鬆開」並只訓練這些層。

因為 Keras 提供很多的預訓練模型,我們將用 Keras 去完成我們最初基準程序,我們將在我們的任務上用 ResNet50 和 InceptionResNetV2 這兩個模型。為了理解在給定模型下,我們是過擬合還是欠擬合數據集,為數據集準備一個簡單模型和一個複雜模型作為基準是非常重要的。

我們也可以檢查這些模型在 ImageNet 數據集上的性能或者這裡的每一個模型的參數數量來選擇我們的基準模型。

對於第一個基準模型,我去掉了最後的輸出層,並且只增加了對應著 12 個類別的輸出層。模型總結貼在這裡了,我們可以看到參數量,接著是最後幾個層的截屏。

我們加了一個稠密的層來得到第一個基準

模型總共訓練了 10 輪,6 輪以後結果飽和了。訓練集上的準確度達到了 88%,驗證集上也有 87% 的準確度。

為了提高性能,一些前面的層被「鬆開」,我們以一個指數下降的學習率去訓練這些層。這個可以進一步得到 2% 的提升。

訓練一些前面的層的結果

這個過程中使用到的一些超參數:

步驟 3:

在具備相關知識的基礎下,我們可以嘗試著增加圖像數據的數量以改進上述模型。

沒有數據,就沒有機器學習!

但需要注意的是我們所擁有的數據往往存在數據類別不平衡的情況。我們首先應該處理這一問題,從而使得模型的每批樣本即便擁有少量圖像數據,也能達到較好的分類效果。

現實生活中的數據集很少能夠達到數據平衡,而且模型對少數類樣本的分類效果並不好。錯誤地分類一個少數類樣本往往比錯誤分類一個正常數量樣本會付出更大的代價。

我們可以用以下兩種演算法來解決數據不平衡問題:

1. 不均衡學習的自適應合成抽樣演算法(ADASYN):ADASYN 通過更多地合成更難學習的數據集,從而為少數類樣本合成更多數據。

ADASYN 演算法的基本思想是根據數據的學習難度,對不同的少數類樣本進行加權分布。相比那些容易學習的少數類樣本,為那些更難學習的少數類樣本合成更多的數據。因此,ADASYN 演算法通過以下兩種方式來改善數據:1)減少類不平衡引起的偏差,2)自適應地將分類決策邊界轉向學習困難的樣本。[5]

2. 合成少數類過採樣演算法 (SMOTE):SMOTE 通過對少數類的過度採樣和對多數類的採樣,從而獲得最佳結果。

相比於對多數類樣本進行欠採樣,通過把對少數(異常)類樣本進行過採樣和對多數(正常)類進行採樣相結合的方式,從而實現更好的分類效果(在 ROC 空間中)。[6]

針對這個實例,SMOTE 演算法相比 ADASYN 演算法表現得更加出色。一旦數據達到平衡,我們便可以把這些數據用於數據集的擴充。

另外有一些數據增強方法,其中比較重要的有:

縮放

裁剪

翻轉

迴轉

翻譯

增加雜訊

改變照明條件

像 GAN 這樣的先進技術

現在已經有一些非常好的博客可以解釋以上所有技巧。[8] [9] 因此這裡不再細述。這裡用到了上面提到的除 GAN 之外的所有數據增強技術。

步驟 4:

......

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!

本站內容充實豐富,博大精深,小編精選每日熱門資訊,隨時更新,點擊「搶先收到最新資訊」瀏覽吧!


請您繼續閱讀更多來自 雷鋒網 的精彩文章:

通用要推動 Cruise 上市,這一步百年巨頭穩贏嗎?
CVPR Spotlight論文:當零示例學習遇上網路數據

TAG:雷鋒網 |