當前位置:
首頁 > 新聞 > MXNet 作者李沐:用深度學習做圖像分類,教程+代碼

MXNet 作者李沐:用深度學習做圖像分類,教程+代碼

MXNet作者/亞馬遜主任科學家 李沐

作者:MXNet作者/亞馬遜主任科學家 李沐

【新智元導讀】深度學習推動計算機視覺、自然語言處理等諸多領域的快速發展。在AI大熱和人才奇缺的今天,掌握深度學習成為進入AI領域研究和應用的必備技能。來自亞馬遜主任科學家李沐將以計算機視覺的經典問題——圖像分類為例,手把手地教導大家從0到1搭建深度神經網路模型。對於初學者面臨的諸多疑問,提供了從環境設置,數據處理,模型訓練,效果調優的完整介紹和代碼演示,包括使模型快速獲得良好效果的常用方法——遷移學習。讓大家有一個全景和基礎的了解。

深度學習時代,網路的加深使得對訓練數據集規模的依賴更勝以往。學術界較成功的大規模數據集通常圍繞基礎性的一般認知問題,離有日常有體感的應用場景較遠。時尚與人們日常生活息息相關,但行業大量內容仍然依賴人工編輯。通過引入人工智慧技術來提升效率,讓機器來認知時尚將是一個有趣且有用的課題。

近期,阿里巴巴圖像和美團隊與香港理工大學紡織及制衣學系聯合舉辦了2018FashionAI全球挑戰賽,並在比賽中開放的FashionAI數據集,是首個圍繞衣食住行中的「衣」的大規模高質量數據集。該數據集包含八種不同服飾的圖片數據,選手們的任務之一就是設計一個演算法對圖片中服飾的屬性做出準確判斷。例如其中的裙子類圖片,就分為不可見,短裙,中裙,七分裙,九分裙和長裙等總共六種屬性。我們可以將其視為經典的圖片分類問題,並通過卷積神經網路來解決。

FashionAI數據集中使用的圖像數據,全部來源於電商真實場景,刻畫了在模型在真實場景應用會遇到的挑戰。在FashoinAI數據集上訓練的模型,既有學術研究價值,又能在未來實際應用,幫助識別服飾上的專業設計元素。對於計算機視覺研究者來說,不失為一個好的選擇。

本文將利用MXNet進行方法講解。MXNet是一個易安裝易上手的開源深度學習工具,它提供了一個python介面gluon,能夠讓大家很快地搭建起神經網路,並進行高效訓練。接下來,我們將以比賽中的裙子任務為例,向大家展示如何用gluon從零開始,設計一個簡單而又效果好的卷積神經網路演算法。


環境配置

系統配置

對於深度學習訓練而言,用GPU加速訓練是很重要的。這次競賽的數據量雖然不算大,但是只用CPU計算可能還是會讓一次模型訓練花上好幾天的時間!因此我們建議大家使用至少一塊GPU來進行訓練。還沒有GPU的同學,可以參考如下兩種選擇:

根據自己的預算和需求入手(年輕人的第)一塊GPU。我們寫了一篇GPU購買指南[1],方便大家選購。

為了這次比賽租用亞馬遜雲的GPU伺服器。我們寫了一篇AWS的運行教程[2],幫助大家配置自己的雲伺服器。

配置好了硬體與系統之後,我們需要安裝Nvidia提供的CUDA與CUDNN,從而把我們的代碼與GPU硬體真正連接起來。這部分的安裝比較容易,可以參考這一部分[3]的指導。

如果選擇使用亞馬遜雲伺服器,那麼我們建議在選擇系統鏡像時選擇Deep Learning AMI,這個鏡像把與GPU訓練相關的環境(CUDA,CUDNN)都已經配置好了,不需要做其他的配置了。

安裝MXNet

配置好了環境之後,我們就可以安裝MXNet了。有很多種方式可以安裝MXNet,如果要在Linux系統上為python安裝GPU版本,只需要執行:

就可以了。如果系統中安裝的是CUDA8.0,可以將代碼改成對應的mxnet-cu80。如果有同學想要使用其他的語言介面或者是操作系統,或者是自己從源碼編譯,都可以在官方的安裝說明[4]中找到符合自己情況的安裝步驟。在接下來的教程中,我們使用MXNet的python介面gluon帶領大家上手此次競賽。


數據處理

數據獲取

首先我們在當前目錄下新建data文件夾,然後從官網上將熱身數據集,訓練數據集和測試數據集下載到data中並解壓。比賽的數據可以從比賽官網[5]獲取,不過同學們要登錄天池賬號並註冊參加比賽之後才能下載。主要的數據集有三個:

fashionAI_attributes_train_20180222.tar是主要訓練數據,裡面含有八個任務的帶標記訓練圖片。這份教程中我們只選用其中的裙子任務做演示。

fashionAI_attributes_test_a_20180222.tar是預測數據,裡面含有八個任務的不帶標記訓練圖片,我們的目的就是訓練出模型之後在這份數據上給出分類預測。

warm_up_train_20180201.tar是熱身數據,裡面含有與訓練集不重複的裙子訓練集圖片,是對訓練數據很重要的補充。在進一步運行前,請確認當前的目錄結構是這樣的:

注意事項:

下載好的數據在解壓前與解壓後會各佔用約8G的硬碟空間,在接下來的數據整理中我們會將數據複製為更方便的目錄結構,因此請預留足夠的硬碟空間。

因為圖片數據集通常很大,因此gluon不會一次性將所有圖片讀入內存,而是在訓練過程中不斷讀取硬碟上的圖片文件。請有條件的同學將圖片存在SSD硬碟上,這樣可以避免數據讀取成為瓶頸,從而大幅提高訓練速度。

首先,我們在data下新建一個目錄train_valid,作為所有整理後數據的目錄。

我們選用裙子數據的原因之一,就是熱身數據與訓練數據中都提供了它的訓練圖片,從而能讓我們能夠有更豐富的訓練資源。下面我們將分別從熱身數據欲訓練數據的標記文件中:

讀取每張圖片的路徑和標籤

將這張圖片按照它的標籤放入data/train_valid目錄下對應的類別目錄中

將前90%的數據用做訓練,後10%的數據用作驗證

第一步,讀取訓練圖片的路徑和標籤。

我們來檢查一下讀入的數據。image_path應該由路徑和圖片對應標籤組成,其中標籤是若干個 n 一個 y 組成的字元串,字母 y 出現的位置就是圖片對應的類型。

可以看出這張圖中的裙子是長裙,對應上官方的說明,可以發現與標記吻合。接下來,我們就準備好訓練集和測試集的目錄,以及6個裙子類別對應的子目錄。

運行後的目錄結構如下:

要想處理其他類型的服飾,只需要將task變數指定為對應的服飾類型名稱就行了。最後,我們將圖片複製到各自對應的目錄中。需要注意的是,這裡我們刻意隨機打亂了圖片的順序,從而防止訓練集與測試集切分不均勻的情況出現。


遷移學習

數據準備完畢,接下來我們可以開始著手設計演算法了。

服裝的識別可以被視作計算機視覺中的經典問題:圖片分類。一個典型的例子是ImageNet數據集與ILSVRC競賽,其中選手們要為分別從屬於1000個類別的逾1400萬張圖片設計演算法,將它們準確分類。在服飾屬性判別競賽中,我們可以認為不同屬性的服飾從屬於不同的類別,於是便能參考ImageNet中的優勝演算法來參賽。

在初賽階段,主辦方給每類服飾各提供了約一萬張圖片用來訓練,這樣的數據量還不足以讓我們從零開始訓練一個很棒的深度學習模型。於是我們可以借用遷移學習的想法,從一個在ImageNet數據集上被訓練好的模型出發,一點點把它改造成「更懂衣服」的模型。如下圖所示,左邊的是在ImageNet數據集上訓練好的網路,右邊的是我們即將用來參賽的網路,這兩個網路主體結構一致,因此我們可以將主要的網路權重都複製過來。因為兩個網路在輸出層的分類個數與含義都不一樣,我們需要將輸出層重新定義並隨機初始化。

在ImageNet數據集上,大家主要用卷積神經網路,而在過去的幾年中也出現了很多不同的網路架構。gluon官方提供了許多不同的預訓練好的卷積神經網路模型,我們在這個比賽中選擇效果比較好的resnet50_v2模型作為訓練的出發點。關於遷移學習更詳細的介紹可以參考gluon中文教程中的Fine-tuning:通過微調來遷移學習[6]一節。

首先,我們準備好需要用到的環境。

下面我們可以一句話導入預訓練好的 resnet50_v2 模型。如果是首次導入模型,代碼會需要一點時間下載預訓練好的模型。

在ImageNet上訓練的模型輸出是1000維的,我們需要定義一個新的resnet50_v2網路,其中

輸出層之前的權重是預訓練好的

輸出是6維的,且輸出層的權重隨機初始化

之後,我們可以根據具體的機器環境選擇將網路保存在CPU或者是GPU上。

在上面代碼中的最後一行我們調用了hybridize,這是gluon的主要特性之一,能將命令式編程構建的模型在執行時把大部分運算轉成符號式來執行,這樣一方面提高了開發效率,同時也保證了運行速度。關於hybridize更詳細的介紹可以參考gluon中文教程中的Hybridize:更快和更好移植[7]一節。

接下來我們定義幾個輔助函數,它們分別是

計算AveragePrecision,官方的結果評價標準。

訓練集與驗證集的圖片增廣函數。

每輪訓練結束後在測試集上評估的函數

關於圖片增廣更詳細的介紹可以參考中文教程中的圖片增廣[8]一節。

下面我們定義一些訓練參數。注意,在遷移學習中,我們一般認為整個網路的參數不需要進行很大地改動,只需要在訓練數據上微調,因此我們的學習速率都設為一個比較小的值,比如0.001。

為了方便演示,我們只循環兩輪訓練,展示過程。

接下來我們可以讀入數據了。經過之前的整理,數據可以用介面gluon.data.DataLoader讀入

下面我們定義網路的優化演算法和損失函數。這次比賽中我們選用隨機梯度下降就能得到比較好的效果。分類問題一般用交叉熵作為損失函數,另外,我們除了mAP指標之外也關心模型的準確率。

至此萬事俱備,我們可以開始訓練了!再次提醒,這裡為了快速演示,我們只做兩次循環,為了達到更好的訓練效果請記得將epochs調大。

訓練結束了,那效果怎麼樣呢?我們可以直接拿幾張測試集的圖片出來,用人眼對比一下看看預測的類型是否準確。

可以看到,雖然只有兩輪訓練,但我們的模型在展示的幾張圖片上都做出了正確的預測。

總結

至此,我們展示了從數據整理直到作出預測的樣例代碼。你可以從這裡開始,不斷地改進代碼,向著更好的結果出發。也建議大家去下載FashoinAI數據集,直接用實踐本文中所學習到的技巧。下面我們給出一些可以改進的方向,你可以從他們開始著手:

1.調整參數,比如學習速率,批量大小,訓練循環次數等。

參數之間是有互相影響的,比如更小的學習速率可能意味著更多的循環次數。

建議以驗證集上的結果來選擇參數

不同數據的最佳參數可能是不一樣的,建議對每個任務選取相應的最佳參數

2.選擇模型

除了ResNet模型之外,gluon還提供很多其他流行的卷積神經網路模型,可以到官方文檔根據它們在ImageNet上的表現進行選擇。

在計算資源有限的情況下,可以考慮選用占內存更小、計算速度更快的模型。

3.更全面的圖片增廣

可以考慮在訓練時加上更多的圖片操作。image.CreateAugmenter函數有很多其他的參數,不妨分別試試效果。

在預測時將預測圖片做不同的裁剪/微調並分別預測,最後以平均預測值為最後答案,可以得到更穩健的結果。

參考鏈接:

[1]GPU購買指南 http://zh.gluon.ai/chapter_preface/buy-gpu.html

[2]AWS的運行教程 http://zh.gluon.ai/chapter_preface/aws.html

[3]CUDA安裝 http://zh.gluon.ai/chapter_preface/aws.html#cuda

[4]MXNet安裝 http://mxnet.incubator.apache.org/install/index.html

[5]獲取比賽數據 https://tianchi.aliyun.com/m.html#/competition/231649

[6]微調教程 http://zh.gluon.ai/chapter_computer-vision/fine-tuning.html

[7]Hybridize:更快和更好移植 http://zh.gluon.ai/chapter_gluon-advances/hybridize.html

[8]圖片增廣 http://zh.gluon.ai/chapter_computer-vision/image-augmentation.html


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

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


請您繼續閱讀更多來自 新智元 的精彩文章:

李沐:十分鐘從 PyTorch轉MXNet
剛剛,黃仁勛發布全球最大GPU,超算級逆天算力,僅售39.9萬美元

TAG:新智元 |