當前位置:
首頁 > 新聞 > Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

背靠 fast.ai 庫與視頻教程,首戰 Kaggle 競賽,新手在油棕種植園衛星圖像識別中獲得第三名。

Women in Data Science 與合作夥伴共同發起了 WiDS 數據馬拉松競賽(WiDS datathon)。賽題是創建一個能夠預測衛星圖像上油棕種植園存在情況的模型。

Planet 和 Figure Eight 慷慨地提供了衛星圖像的帶注釋數據集,而該衛星圖像是最近由 Planet 衛星拍攝的。該數據集圖像具有 3 米的空間解析度,並且每一副圖像都基於是否含油棕種植園來標記(0 意為沒有油棕種植園,1 意為存在一個油棕種植園)。

競賽任務是訓練一個模型,該模型能夠輸入衛星圖像,輸出包含油棕種植園圖像的似然預測。在模型開發中,競賽舉辦者提供帶標籤的訓練和測試數據集。

詳細信息參見:https://www.kaggle.com/c/widsdatathon2019

我和隊友(Abdishakur、Halimah 和 Ifeoma Okoh)使用 fast.ai 框架來迎接這項賽題。非常感謝 Thomas Capelle 在 kaggle 上的啟動內核,該內核為解決這個問題提供了諸多見解。

此外,還要感謝 fast.ai 團隊,該團隊創建了一門不可思議的深度學習課程,該課程簡化了大量困難的深度學習概念。現在,深度學習初學者也可以贏得 kaggle 競賽了。

課程地址:https://course.fast.ai/

從一個通俗易懂的深度學習指南開始

不要想著馬上就能理解所有東西,這需要大量的練習。本指南旨在向深度學習初學者展示 fast.ai 的魅力。假定你了解一些 python 知識,也對機器學習稍有涉獵。這樣的話,我們就走上了學習正軌。

(引用)本文展示的所有代碼可在 Google Colaboratory 中找到:這是一個 Jupyter 筆記本環境,不需要進行任何設置就可以使用,並且完全在雲端運行。你可以通過 Colaboratory 編寫和執行代碼,保存和分享分析,訪問大量的計算資源,所有這些都是免費的。

代碼參見:https://colab.research.google.com/drive/1PVaRPY1XZuPLtm01V2XxIWqhLrz3_rgX。

導入 fast.ai 和我們將要使用的其他庫

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

輸入庫

獲取競賽數據

為了儘可能簡潔明了,Abdishakur 上傳競賽數據文件至 dropbox.com。你可以在競賽頁面上找到這些數據。你需要接受競賽規則,並在參賽後訪問數據。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

觀察數據

我們在解決一個問題時首先要做的是觀察可用數據。在想出解決方案之前,我們需要理解這個問題以及數據是什麼樣的。觀察數據意味著理解數據目錄的構成方式、數據標籤以及樣本圖像是什麼樣的。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

使用 pandas 庫來讀取數據。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練模型所要使用的數據標籤。

處理「圖像分類數據集」和「表格數據集」的主要區別在於標籤的存儲方式。這裡的標籤指的是圖像中的內容。在這個特定的數據集中,標籤以 CSV 文件格式存儲。

想要了解更多計算「分數」列的方法,點擊:

https://success.figure-eight.com/hc/en-us/articles/201855939-How-to-Calculate-a-Confidence-Score。

我們將使用 seaborn 的 countplot 函數來觀察訓練數據的分布。我們從下圖中看到,大約 14300 個圖像中沒有發現油棕種植園,而僅有 942 個圖像中發現了油棕種植園。這就是所謂的不平衡數據集,但我們在這裡不討論這個深度學習問題。我們此刻正邁出了一小步。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

統計兩個類別的樣本數。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練數據集中分布

準備數據

提供的測試數據放置於兩個不同的文件夾中: leaderboard 留出數據和 leaderboard 測試數據。由於競賽要求提交這兩種數據集的預測,所以我們將兩者相結合。我們共獲得 6534 副圖像。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

結合 leaderboard 留出數據和 leaderboard 測試數據。

我們將使用 fast.ai 的 DataBlock API 來構成數據,這是一種將數據集呈現給模型的簡便方法。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

創建一個 ImageList 來保留數據

我們將使用 ImageList 來保存訓練數據,並使用 from_df 方法讀取數據。這樣做的原因是,我們將訓練集信息儲存在了名為 df 的 DataFrame 中。

接下來需要隨機分割訓練集,並保留 20% 作為驗證集,從而在訓練中監督模型性能。我們選擇了一個 seed,以確保再一次訓練時能得到相同的結果,通過相同的 seed,我們就能知道哪些改進是好的,哪些是壞的。

此外,我們同樣還要把訓練集的標籤地址提供給 ImageList,並將數據與標籤合併。

最後,還需要在數據上執行轉換,通過設定 flip_vert = True 將翻轉圖像,這能幫助模型識別不同朝向的圖像。此外,還需要使用 imagenet_stats 來歸一化圖像。

預覽圖像

如下是有或沒有油棕種植園的衛星圖像:

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

展示兩個 Batch 的圖像。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

有油棕的圖像標記為 1,沒有油棕的標記為 0

訓練我們的模型

現在,開始訓練我們的模型。我們將使用卷積神經網路作為主體,並利用 ResNet 模型的預訓練權重。ResNet 模型被訓練用來對各種圖像進行分類,不用擔心它的理論和實現細節。現在,我們構建的模型以衛星圖像作為輸入,並輸出這兩個類別的預測概率。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

卷積神經網路

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

搜索最佳模型學習率。

接下來,我們用 lr_find() 函數找到了理想的學習率,並使用 recorder.plot() 對其進行了可視化。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

搜索最佳模型學習率。

我們將選擇斜率最大的學習率,在這裡我們選擇的是 1e-2。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

用學習率 1e-2 對模型展開 5 個周期的訓練。

我們將使用 fit_one_cycle 函數對模型進行 5 個 epoch 的訓練(遍歷所有數據 5 次)。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練和驗證損失。

注意展示的 metrics,即 training_loss 和 valid_loss。隨著時間的推移,我們使用它們來監控模型的改進。

最佳模型是在第四個 epoch 時獲得的。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練階段模型的輸出;訓練和驗證損失的變化過程。

在你進行訓練和驗證數據集時,fast.ai 只在內部挑選並保存你的最佳模型。

評估我們的模型

競賽提交的材料是根據預測概率和觀測目標 has_oilpalm 之間的 ROC 曲線來評估的。默認情況下,Fast.ai 不會附帶這個指標,所以我們將使用 scikit-learn 庫。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

列印驗證指標。

使用預訓練模型和 fast.ai 的妙處在於,你可以獲得很好的預測準確率。在我們的案例中,沒有費多大力就獲得了 99.44% 的準確率。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練第一階段的指標。

保存模型,並繪製關於預測的混淆矩陣。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

使用混淆矩陣查看結果

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

繪製混淆矩陣

混淆矩陣是一種圖形化的方式,可以查看模型準確或不準確的預測圖像數量。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

第一個訓練階段的混淆矩陣。

從這個矩陣中可以看出,模型準確地預測出有 2863 張圖像中沒有油棕,168 張圖像中有油棕。10 張有油棕的圖像被分類為沒有,而 7 張沒有油棕的圖像則被分類為有油棕。

對這種簡單的模型來說,這個結果不錯了。接下來,我們搜索到了訓練的理想學習率。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

搜索理想的學習率。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

我們在學習率 1e-6 和 1e-4 之間選擇了一個學習率。

在 7 個 epoch 內,使用 1e-6 和 1e-4 之間的最大學習率來擬合模型。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

對模型進行 7 個周期的訓練,學習率應在 1e-6 和 1e-4 範圍內。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練和驗證損失。

以圖形方式觀察訓練指標,以監控每個訓練周期後模型的性能。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練階段模型的輸出;訓練和驗證損失的變化過程。

保存模型的第二個訓練階段:

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

準確率、誤差率和 AUC 分數

列印模型的準確率、誤差率和 AUC 指標:

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

第二個訓練階段的指標。

如你所見,模型的準確率從 99.44% 上升到了 99.48%。誤差率從 0.0056 降到了 0.0052。AUC 也從 99.82% 上升為 99.87%。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

繪製混淆矩陣。

與我們繪製的上一個混淆矩陣相比,你會發現模型的預測效果更好了。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

第二個訓練階段的混淆指標

之前有 7 張不含油棕種植園的圖像被錯誤分類,現在降到了 3 張,這就是進步。

我們在訓練和調參期間遵循了一種模式。大多數深度學習實驗都遵循類似的迭代模式。

圖像轉換

我們將在數據上執行更多的圖像轉換,這應該是能提升模型效果的。圖像轉換的具體描述可以在 fast.ai 文檔中找到:

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

應用不同的轉換以提升模型效果

max_lighting:如果超參不為 None,那麼以 p_lighting 為概率隨機進行亮度、對比度的調整,且最大亮度不超過 max_lighting。

max_zoom:如果超參不小於 1,那麼以 p_affine 為概率隨機放大 1 到 max_zoom 倍。

max_warp:如果超參不為 None,那麼以 p_affine 為概率在-max_warp 和 max_warp 之間隨機對稱變換。

我們再一次搜索最優學習率:

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

搜索一個合理的學習率

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

我們選擇的學習率是 1e-6

將模型訓練 5 個周期。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練和驗證損失

比較訓練指標,並與過去的指標進行比較。我們的模型在這次迭代中略遜於 0.0169 和 0.0163。先不要泄氣。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練階段模型的輸出;在第 3 個 epoch 時得到最佳模型

保存模型訓練的第三個階段並列印出指標。如圖所示,當前模型的準確率為 99.38,上一個階段的準確率為 99.48%。AUC 分數從 99.87% 提高到了 99.91%,這是比賽評分的標準。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

準確率、誤差率和 AUC 分數

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

第三個訓練階段的指標

最終訓練階段

你可能注意到了,我們剛開始使用的圖像大小為 164,然後逐漸增加到 256(如下所示)。這麼做是為了利用 fast.ai 用於分類的漸進式圖像大小縮放,即在一開始使用小圖像,之後隨著訓練逐漸增加圖像大小。如此一來,當模型早期非常不準確時,它能迅速看到大量圖像並實現快速改進,而在後期訓練中,它可以看到更大的圖像,學到更多細粒度的差別。(詳情請參見:現在,所有人都可以在 18 分鐘內訓練 ImageNet 了)

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

應用不同的變換來改進模型,將圖像大小增加到 256

我們又發現了一個最佳學習率。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

找到理想學習率

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

找到理想的學習率

以 1e-4 的學習率訓練 5 個 epoch 以擬合模型。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

以 1e-4 的學習率對模型訓練 5 個周期

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

訓練和驗證損失

觀察訓練指標並與之前的指標對比。我們的模型有了小小的提升(損失從 0.169 降到了 0.168)。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

模型訓練階段的輸出。在第 2 個 epoch 時得到最佳模型

保存模型最後的訓練階段並列印出指標。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

準確率、誤差率和 AUC 分數

如下所示,模型的準確率為 99.44%,優於上一個訓練階段 99.38% 的準確率。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

第四個訓練階段的指標

準備一個競賽提交文件

現在可以看到我們的模型對未見過的數據做出了多麼好的預測。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

準備一個 CSV 提交文件

將文件提交給 WiDS Datathon

你仍然可以參加 WiDS 競賽並晚一點提交。進入參賽頁面,點擊「Join Competition」,了解比賽規則。現在你可以提交作品,看看自己會排到第幾。

Kaggle首戰斬獲第三,看深度學習菜鳥團隊如何一鳴驚人

根據模型預測對提交的作品進行打分

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

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


請您繼續閱讀更多來自 機器之心 的精彩文章:

INTERFACE#13 這周六,線下學習圖神經網路
PointConv:在點雲上高效實現卷積操作

TAG:機器之心 |