當前位置:
首頁 > 最新 > 22分鐘直衝Kaggle競賽第二名!一文教你做到

22分鐘直衝Kaggle競賽第二名!一文教你做到

選自微軟機器學習博客

機器之心編譯

參與:陳韻竹、路雪

本文介紹了如何使用微軟 DVSM、利用遷移學習技術在 20 多分鐘時間內達到 Kaggle 貓狗識別競賽的第二名的性能。

引言

幾周前,我寫了一篇博客《deep learning and computer vision in the Microsoft Azure cloud》,簡要介紹了微軟的數據科學虛擬機(DVSM)。本文更偏重實際操作,緣起於 PyImageSearch 讀者 Kostas 給我發來的一封郵件:

「你好,Adrian!我對 Kaggle 競賽(特別是計算機視覺領域的 Kaggle 競賽)很感興趣。我在計算機視覺和機器學習/深度學習方面有一些經驗,但經驗尚不豐富。請問參加這個比賽值得嗎?我有沒有和其他選手競爭對抗的實力?」

Kostas,這是個好問題——我敢肯定,有類似疑問的不止你一個人。

讓我來用一個故事回答你的問題吧:

當我第一次著手編寫我的新書《Deep Learning for Computer Vision with Python》時,我的目標是寫一本能同時面向新手、有經驗的研究人員和從業者的書/自學項目。

那本書從神經網路和機器學習的基礎出發,當你根據此書自學到最後時,你就能從零開始搭建最先進的網路模型了。

聽起來這是個合乎邏輯的漸進式教育項目,能讓你從入門到精通——說得通,對吧?

但是,這個過程中發生了一件很有意思的事情……

當你閱讀了約 25% 的內容時,你已經可以像深度學習實踐者那樣,有足夠的經驗開始解決計算機視覺問題了。那些曾對你來說幾乎不可能的問題現在也許變得不那麼遙遠——而且在某些情況下,你可以利用特定的技術解決這些問題。

其中有個很好的例子是 Kaggle 貓狗識別競賽:

目標很簡單:把輸入圖像分類為狗或貓。

這對我們來說非常容易——人腦可以輕鬆分辨出這兩種家庭寵物的差異。

但是,對於計算機呢?這就沒那麼簡單了。計算機能看到的只是一個 0 和 1 組成的巨大矩陣。我們如何學習這些圖像中的模式,從而分辨貓和狗?

2014 年這個挑戰賽發布時,受到了大家的廣泛歡迎。這對於研究人員和工程師來說是個挑戰。它獲得了大量的關注,因為這個問題看起來非常容易。此外,誰不喜歡看這些可愛的小動物呢?

超過 200 支隊伍參與了這場挑戰,他們嘗試了數百種演算法及其變體,花費了數千小時的計算時間。

那麼今天呢?如果使用從預訓練的卷積神經網路中提取的特徵,我們可以在這個挑戰賽中獲得第二名的好成績。

而且,最棒的事情是,如果使用微軟的 DSVM(預安裝了所有必備的計算機視覺和深度學習庫),我們可以在 22 分鐘的時間內獲得第二名!

代碼地址:http://pyimg.co/5jhwg

讓我們啟動 Ubuntu DSVM 實例,計時開始!

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

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

我們向網路輸入圖像

圖像經正向傳播通過網路

在網路的末端獲得最終的分類概率

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

讓我們用 Simonyan 和 Zisserman 提出的 VGG16 架構舉個例子:

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

為了將網路變成特徵提取器,我們可以在概念上「移除」網路的全連接層,返回最終池化層的輸出(上圖右側)——該輸出將作為我們的特徵向量。

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

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

下載 Kaggle:Dogs vs. Cat 數據集

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

我的 Jupyter Notebook:http://pyimg.co/5jhwg

Kaggle Dogs vs. Cats 數據集:https://www.kaggle.com/c/dogs-vs-cats

為簡潔起見,我們不會將測試集提交給評估伺服器。只需下載「train.zip」文件即可。注意:如果你嘗試使用「test1.zip」,我們將無法從文件路徑中提取類別標籤。請不要下載「test1.zip」。

在你下載「train.zip」之後,將其解壓,然後你就會得到一個名為「train」的目錄,其中有 25000 張關於貓和狗的 JPG 格式圖像。

從這裡開始,我們可以應用遷移學習了。

DSVM 上的遷移學習

為保證你能跟上進度,請確保你已下載與本文相關的 Jupyter Notebook。

第一個步驟是抓取 Kaggle Dogs vs. Cats 數據集中所有 25000 張圖像的路徑(見 cell 3):

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

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

本節不再贅述整個的循環(請參閱我們的 Jupyter Notebook,其中有完整的文檔化代碼),僅介紹其中最重要的代碼片段:

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

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

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

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

訓練模型僅用時 36s。

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

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

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

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

微軟的 Ubuntu DSVM

遷移學習/特徵提取

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

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

下一步

通過本文,你學習了如何應用微軟的 DSVM 以及深度學習、卷積神經網路在 Kaggle Dogs vs. Cats 挑戰賽中達到第二名的性能。

我們使用了遷移學習(具體來說是特徵提取)技術獲得了這個結果。

由於 DSVM 配備了所有你在啟動、運行本項目所必需的計算機視覺和深度學習庫,因此我們:

不僅僅獲得了第二名;

同時還打破了計算時長的記錄——用時僅 20 多分鐘。

結合一些深度學習的知識和預配置的 Ubuntu DSVM 環境,我們可以快速、高效地實現這一結果。

如果你想了解更多關於 DSVM 的知識並建立你的首個實例,請點擊以下鏈接:https://azure.microsoft.com/en-us/services/virtual-machines/data-science-virtual-machines/

如果你對深度學習的更多細節感興趣,可以閱讀我編寫的書和自學教程《Deep Learning for Computer Vision with Python》——我個人已經檢驗了每個代碼示例,保證它在 Ubuntu DSVM 中是開箱即用的。

原文地址:https://blogs.technet.microsoft.com/machinelearning/2018/02/22/22-minutes-to-2nd-place-in-a-kaggle-competition-with-deep-learning-azure/

本文為機器之心編譯,轉載請聯繫本公眾號獲得授權。

?------------------------------------------------

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

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


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

拓撲數據分析TDA,有望打破人工智慧黑箱的神奇演算法
情緒激動的陸奇在CES發布阿波羅2.0

TAG:機器之心 |