kaggle開放數據衛星圖片識別棕櫚種植園比賽

Submitted by neurta on Wed, 04/24/2019 - 12:52
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 團隊,該團隊創建了一門不可思議的深度學習課程,該課程簡化了大量困難的深度學習概念?,F在,深度學習初學者也可以贏得 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。你可以在競賽頁面上找到這些數據。你需要接受競賽規則,并在參賽后訪問數據。

獲取競賽數據

觀察數據

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

?

觀察數據

?

使用 pandas 庫來讀取數據。

圖片數據

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

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

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

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

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

數據列

統計兩個類別的樣本數

兩個類別的樣本數

訓練數據集中分布

準備數據

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

6534 副圖像

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

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

DataBlock API

創建一個ImageList來保留數據

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

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

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

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

預覽圖像

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

預覽圖像

?

展示兩個 Batch 的圖像。

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

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

訓練我們的模型

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

?

訓練我們的模型

?

卷積神經網絡

卷積神經網絡

搜索最佳模型學習率。

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

?

最佳模型學習率

?

搜索最佳模型學習率。

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

學習率

?

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

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

5 個周期的訓練

訓練和驗證損失。

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

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

訓練和驗證損失

?

Comments

搜索一個合理的學習率

找到理想學習率

找到理想的學習率

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

?

5 個 epoch 以擬合模型

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

?

5個周期

訓練和驗證損失

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

2個epoch最佳模型

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

保存模型最后的訓練階段并打印出指標。

保存模型后訓練指標

?

打印指標

準確率、誤差率和 AUC 分數

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

準確率

第四個訓練階段的指標

準備一個競賽提交文件

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

預測結果 訓練

準備一個 CSV 提交文件

將文件提交給 WiDS Datathon

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

結果

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


原文鏈接:https://towardsdatascience.com/how-a-team-of-deep-learning-newbies-came-3rd-place-in-a-kaggle-contest-644adcc143c8?

冯仰妍破处门