03.03 怎麼參加Kaggle比賽?

dee192977422


有個很好的例子是 Kaggle Dogs vs. Cats challenge:

目標很簡單:對輸入圖像分類為狗或貓。這對我們來說非常容易——人腦可以輕鬆分辨出這兩種家庭寵物的差異。

但是,對於一臺電腦來說呢?這就沒那麼簡單了。電腦能看到的只是一個巨大的充滿 0 和 1 的矩陣。我們如何在這些圖像中學習相應的模式,從而分辨貓和狗?2014 年發佈這個挑戰時,它受到了大家的歡迎。這對於研究人員和工程師來說是個挑戰。它獲得了大量的關注,因為這個問題看似非常容易。此外,誰不喜歡看這些可愛的小動物呢?超過 200 支隊伍參與了這場挑戰,他們嘗試了數百種算法及其變型,耗費了數千小時的計算時間。

那麼今天呢?如果使用從預訓練的卷積神經網絡中提取的特徵,我們可以在這個挑戰中獲得第二名的好成績。而且,最棒的事情是,如果使用微軟的 DSVM(預下載了所有必備的計算機視覺和深度學習庫),我們可以在 22 分鐘的時間內獲得第二名!代碼地址是:http://pyimg.co/5jhwg讓我們啟動 Ubuntu DSVM 實例,計時開始!

通過特徵提取進行遷移學習

通常而言,我們將卷積神經網絡視為端到端的圖像分類器:

  1. 我們向網絡輸入圖像
  2. 圖像經正向傳播通過網絡
  3. 在網絡的末尾獲得最終的分類概率

但是,並沒有「規則」表明我們必須讓圖像在整個網絡中正向傳播。相反,我們可以終止任何一層網絡(例如激活層或池化層)的傳播過程,在這一位置提取網絡的值,然後使用提取的值作為特徵向量。讓我們用 Simonyan 和 Zisserman 提出的 VGG16 架構舉個例子:

上圖左側是原始的 VGG16 的架構,它可以輸出 1000 個 ImageNet 類別標籤的概率。

為了將網絡編程一個特徵提取器,我們可以在概念上「移除」網絡的全連接層,相反,返回最終池化層(上圖右側)的輸出——這個輸出將作為我們的特徵向量。

由於在 ImageNet 數據集上訓練的 CNN 傾向於學習大量的判別過濾器,我們通常可以在未經訓練的數據集上使用這些預訓練的網絡——我們把這個過程成為遷移學習。

我們可以將在 ImageNet 數據集中訓練的 CNN 的知識進行遷移,將所學的知識編碼為特徵向量,然後在這些特徵向量的基礎上訓練一個簡單的機器學習模型(例如 Logistic 迴歸分類器、線性 SVM 等)。

下載 Kaggle:Dogs vs. Cat 數據集

為了瞭解整個過程的工作流程,請確保已下載:

  1. Jupyter Notebook,它包含了本文的封面
  2. Kaggle Dogs vs. Cats 數據集

為了簡單起見,我們不會將測試集提交給評價服務器。相反,只需下載「train.zip」文件即可。注意:如果你嘗試使用「test1.zip」,我們將無法從文件路徑中提取類別標籤。請不要下載「test1.zip」。在你下載「train.zip」之後,將其解壓,然後你就會得到一個名為「train」的目錄,其中有 25000 張關於貓和狗的、JPG 格式的圖片。從這裡開始,我們就可以應用遷移學習了。

DSVM上的遷移學習

為保證你能跟上進度,請確保你已下載與本文相關的 Jupyter Notebook。第一個步驟是抓取 Kaggle Dogs. vs. Cats 數據集中所有 25000 張圖像的路徑(見 cell 3):

Dogs vs. Cats 數據集中文件的名稱都諸如「cat.153.jpg」或「dog.4375.jpg」——因為類別標籤已經寫在了文件名中,所以我們可以很容易地提取它們(見 cell 4)

為了執行特徵提取,我們需要一個預訓練的網絡——ResNet50 是一個不錯的選擇(見 cell 5)。請注意,我們利用 忽略了所有的全連接層,這讓我們能夠輕鬆執行特徵提取。

在我們擁有所有的圖像路徑後,我們需要對它們逐一進行循環,並建立批量,讓它們通過網絡進行特徵提取。

在本節中,介紹整個的循環太過複雜(請參閱我們的 Jupyter Notebook,其中有完整的文件代碼),不過其中最重要的代碼片段節選如下:

對於每個批量的圖像,我們將其傳遞給神經網絡,然後將最大池化層的輸出作為我們的特徵。我們將最大池化層的輸出壓縮成 2048-d 的特徵向量。這些特徵以數據矩陣的形式堆疊在一起,因此我們可以在這些特徵上訓練模型。

對於 25000 張圖像,整個數據矩陣佔用大約 204MB 的 RAM,即使是最小規模的機器也可以輕鬆管理。

整個特徵提取過程使用了 Ubuntu DSVM(同樣我們不需要手動配置或構建,這節省了大量的時間),共耗時 22 分 48 秒。

考慮到我們提取的特徵,我們使用 75% 的數據作為訓練集,使用 25%作為測試集,訓練了一個 Logistic 迴歸分類器(網格搜索適當的參數):

訓練模型僅用時 36s

所以,我們是如何做到的?

通過評估我們的 Logistic 迴歸分類器,我們發現我們的模型在測試集上達到了98.8896%的準確率:


這個準確率足以在 Kaggle Dogs vs. Cat 競賽中獲得第二名:

不過,這種比較並不是完全公平,因為我們沒有在 Kaggle 競賽提供的測試集中評估(取而代之,我們生成了我們自己的測試集)並將結果提交給評估服務器(因為這不在本入門教程的範圍之內) ,但我認為你應該理解了我要表達的意思。 在不到 25 分鐘的計算時間內,我們可以使用:

  1. 微軟的 Ubuntu DSVM
  2. 遷移學習/特徵提取

建立一個模型,從而在這個挑戰中提供具有強大競爭力的準確率。

請自如地使用本文的代碼,將其作為你自己深度學習項目的起點。


機器之心Pro


Kaggle比賽是機器學習愛好者的樂園,很多人從小白變成大牛就是從這裡學到了很多實戰項目經驗。Kaggle中的項目一般來源於工業界,有著實際的需求。具有一定的挑戰性,獎金豐富誘人,值得一試。下面重點寫一下如何去參加一場kaggle比賽:

1.申請kaggle賬號

圖1-1Kaggle官網

圖1-2 註冊Kaggle賬號

2.進入頁面後點擊competitions

3.Kaggle比賽時效

進入後可以看到三個標籤,分別是:

Entered Competitions, Active Competitions, Completed Competitions

他們分別代表已經參加的比賽,未參加還沒有結束的比賽,已經結束的比賽。

圖3-1Entered Competitions

圖3-2Active Competitions

圖3-3Completed Competitions

4.以TGS Salt Identification Challenge競賽為例(點擊對應賽事即可查看)

進入後頁面如下:

圖4-1

5. 競賽頁面佈局介紹

圖5-1

可以看到大體有7個板塊,分別為:

Overview, Data ,Kernels ,Discussion ,Leaderboard ,Rules ,Team

然後一個一個來看他們的縱向板塊,首先是

①Overviews:

圖5-2

Overview有4個縱向板塊:

Description:對比賽背景的一些介紹

Evaluation:評價訓練模型性能的標準

Prizes:獎池介紹

Timelines:比賽的時間軸,何時報名,何時結束,何時頒獎等等

②Data:

圖5-3

圖5-4

圖5-5

預覽窗口是為了讓我們不需要下載數據集也可以看到裡面的數據具體是什麼樣子,只需要點擊Data source裡羅列的數據即可,預覽效果如圖5-5。

圖5-6

圖5-7

③kernels:

圖5-8

kernels主要分為3個模塊:

Public,Yourwork,Favorites

Public:這裡是所有願意公開的代碼展示,點擊名稱即可進去參觀他人的代碼,進入後如圖5-9所示,可以看到多個選項,通過點擊Notebook和 Code選項可以查看他的代碼,點擊output可以看到他最後的輸出,點擊Comments可以看到一些評論。

圖5-9

Yourwork:你上傳的代碼

Favorites:你喜歡的

④Discussion

圖5-10

這個版塊主要是一些話題討論

⑤Leaderboard

圖5-11

從這裡可以看到參加比賽的隊伍目前的排名

⑥Rules

圖5-12

這個版塊主要介紹的是比賽的一些規則。

⑦Team

圖5-13

在這個版塊來創建你自己的參賽隊伍

6.最後來介紹一下如何上傳自己的代碼

圖6-1

點擊submit Predictions即可進入下面界面:

圖6-2

在這裡即可提交你的預測結果文件。

以上這些便是參加kaggle比賽的詳細介紹了,快去大展身手吧~


分享到:


相關文章: