深度學(xué)習(xí)推動(dòng)計(jì)算機(jī)視覺、自然語言處理等諸多領(lǐng)域的快速發(fā)展。在AI大熱和人才奇缺的今天,掌握深度學(xué)習(xí)成為進(jìn)入AI領(lǐng)域研究和應(yīng)用的必備技能。來自亞馬遜主任科學(xué)家李沐將以計(jì)算機(jī)視覺的經(jīng)典問題——圖像分類為例,手把手地教導(dǎo)大家從0到1搭建深度神經(jīng)網(wǎng)絡(luò)模型。對(duì)于初學(xué)者面臨的諸多疑問,提供了從環(huán)境設(shè)置,數(shù)據(jù)處理,模型訓(xùn)練,效果調(diào)優(yōu)的完整介紹和代碼演示,包括使模型快速獲得良好效果的常用方法——遷移學(xué)習(xí)。讓大家有一個(gè)全景和基礎(chǔ)的了解。
深度學(xué)習(xí)時(shí)代,網(wǎng)絡(luò)的加深使得對(duì)訓(xùn)練數(shù)據(jù)集規(guī)模的依賴更勝以往。學(xué)術(shù)界較成功的大規(guī)模數(shù)據(jù)集通常圍繞基礎(chǔ)性的一般認(rèn)知問題,離有日常有體感的應(yīng)用場景較遠(yuǎn)。時(shí)尚與人們?nèi)粘I钕⑾⑾嚓P(guān),但行業(yè)大量內(nèi)容仍然依賴人工編輯。通過引入人工智能技術(shù)來提升效率,讓機(jī)器來認(rèn)知時(shí)尚將是一個(gè)有趣且有用的課題。
近期,阿里巴巴圖像和美團(tuán)隊(duì)與香港理工大學(xué)紡織及制衣學(xué)系聯(lián)合舉辦了2018FashionAI全球挑戰(zhàn)賽,并在比賽中開放的FashionAI數(shù)據(jù)集,是首個(gè)圍繞衣食住行中的“衣”的大規(guī)模高質(zhì)量數(shù)據(jù)集。該數(shù)據(jù)集包含八種不同服飾的圖片數(shù)據(jù),選手們的任務(wù)之一就是設(shè)計(jì)一個(gè)算法對(duì)圖片中服飾的屬性做出準(zhǔn)確判斷。例如其中的裙子類圖片,就分為不可見,短裙,中裙,七分裙,九分裙和長裙等總共六種屬性。我們可以將其視為經(jīng)典的圖片分類問題,并通過卷積神經(jīng)網(wǎng)絡(luò)來解決。
FashionAI數(shù)據(jù)集中使用的圖像數(shù)據(jù),全部來源于電商真實(shí)場景,刻畫了在模型在真實(shí)場景應(yīng)用會(huì)遇到的挑戰(zhàn)。在FashoinAI數(shù)據(jù)集上訓(xùn)練的模型,既有學(xué)術(shù)研究價(jià)值,又能在未來實(shí)際應(yīng)用,幫助識(shí)別服飾上的專業(yè)設(shè)計(jì)元素。對(duì)于計(jì)算機(jī)視覺研究者來說,不失為一個(gè)好的選擇。
本文將利用MXNet進(jìn)行方法講解。MXNet是一個(gè)易安裝易上手的開源深度學(xué)習(xí)工具,它提供了一個(gè)python接口gluon,能夠讓大家很快地搭建起神經(jīng)網(wǎng)絡(luò),并進(jìn)行高效訓(xùn)練。接下來,我們將以比賽中的裙子任務(wù)為例,向大家展示如何用gluon從零開始,設(shè)計(jì)一個(gè)簡單而又效果好的卷積神經(jīng)網(wǎng)絡(luò)算法。
亞馬遜主任科學(xué)家 李沐
環(huán)境配置
系統(tǒng)配置
對(duì)于深度學(xué)習(xí)訓(xùn)練而言,用GPU加速訓(xùn)練是很重要的。這次競賽的數(shù)據(jù)量雖然不算大,但是只用CPU計(jì)算可能還是會(huì)讓一次模型訓(xùn)練花上好幾天的時(shí)間!因此我們建議大家使用至少一塊GPU來進(jìn)行訓(xùn)練。還沒有GPU的同學(xué),可以參考如下兩種選擇:
根據(jù)自己的預(yù)算和需求入手(年輕人的第)一塊GPU。我們寫了一篇GPU購買指南[1],方便大家選購。
為了這次比賽租用亞馬遜云的GPU服務(wù)器。我們寫了一篇AWS的運(yùn)行教程[2],幫助大家配置自己的云服務(wù)器。
配置好了硬件與系統(tǒng)之后,我們需要安裝Nvidia提供的CUDA與CUDNN,從而把我們的代碼與GPU硬件真正連接起來。這部分的安裝比較容易,可以參考這一部分[3]的指導(dǎo)。
如果選擇使用亞馬遜云服務(wù)器,那么我們建議在選擇系統(tǒng)鏡像時(shí)選擇Deep Learning AMI,這個(gè)鏡像把與GPU訓(xùn)練相關(guān)的環(huán)境(CUDA,CUDNN)都已經(jīng)配置好了,不需要做其他的配置了。
安裝MXNet
配置好了環(huán)境之后,我們就可以安裝MXNet了。有很多種方式可以安裝MXNet,如果要在Linux系統(tǒng)上為python安裝GPU版本,只需要執(zhí)行:
就可以了。如果系統(tǒng)中安裝的是CUDA8.0,可以將代碼改成對(duì)應(yīng)的mxnet-cu80。如果有同學(xué)想要使用其他的語言接口或者是操作系統(tǒng),或者是自己從源碼編譯,都可以在官方的安裝說明[4]中找到符合自己情況的安裝步驟。在接下來的教程中,我們使用MXNet的python接口gluon帶領(lǐng)大家上手此次競賽。
數(shù)據(jù)處理
數(shù)據(jù)獲取
首先我們?cè)诋?dāng)前目錄下新建data文件夾,然后從官網(wǎng)上將熱身數(shù)據(jù)集,訓(xùn)練數(shù)據(jù)集和測試數(shù)據(jù)集下載到data中并解壓。比賽的數(shù)據(jù)可以從比賽官網(wǎng)[5]獲取,不過同學(xué)們要登錄天池賬號(hào)并注冊(cè)參加比賽之后才能下載。主要的數(shù)據(jù)集有三個(gè):
fashionAI_attributes_train_20180222.tar是主要訓(xùn)練數(shù)據(jù),里面含有八個(gè)任務(wù)的帶標(biāo)記訓(xùn)練圖片。這份教程中我們只選用其中的裙子任務(wù)做演示。
fashionAI_attributes_test_a_20180222.tar是預(yù)測數(shù)據(jù),里面含有八個(gè)任務(wù)的不帶標(biāo)記訓(xùn)練圖片,我們的目的就是訓(xùn)練出模型之后在這份數(shù)據(jù)上給出分類預(yù)測。
warm_up_train_20180201.tar是熱身數(shù)據(jù),里面含有與訓(xùn)練集不重復(fù)的裙子訓(xùn)練集圖片,是對(duì)訓(xùn)練數(shù)據(jù)很重要的補(bǔ)充。在進(jìn)一步運(yùn)行前,請(qǐng)確認(rèn)當(dāng)前的目錄結(jié)構(gòu)是這樣的:
注意事項(xiàng):下載好的數(shù)據(jù)在解壓前與解壓后會(huì)各占用約8G的硬盤空間,在接下來的數(shù)據(jù)整理中我們會(huì)將數(shù)據(jù)復(fù)制為更方便的目錄結(jié)構(gòu),因此請(qǐng)預(yù)留足夠的硬盤空間。
因?yàn)閳D片數(shù)據(jù)集通常很大,因此gluon不會(huì)一次性將所有圖片讀入內(nèi)存,而是在訓(xùn)練過程中不斷讀取硬盤上的圖片文件。請(qǐng)有條件的同學(xué)將圖片存在SSD硬盤上,這樣可以避免數(shù)據(jù)讀取成為瓶頸,從而大幅提高訓(xùn)練速度。
首先,我們?cè)赿ata下新建一個(gè)目錄train_valid,作為所有整理后數(shù)據(jù)的目錄。
我們選用裙子數(shù)據(jù)的原因之一,就是熱身數(shù)據(jù)與訓(xùn)練數(shù)據(jù)中都提供了它的訓(xùn)練圖片,從而能讓我們能夠有更豐富的訓(xùn)練資源。下面我們將分別從熱身數(shù)據(jù)欲訓(xùn)練數(shù)據(jù)的標(biāo)記文件中:
讀取每張圖片的路徑和標(biāo)簽
將這張圖片按照它的標(biāo)簽放入data/train_valid目錄下對(duì)應(yīng)的類別目錄中
將前90%的數(shù)據(jù)用做訓(xùn)練,后10%的數(shù)據(jù)用作驗(yàn)證
第一步,讀取訓(xùn)練圖片的路徑和標(biāo)簽。
我們來檢查一下讀入的數(shù)據(jù)。image_path應(yīng)該由路徑和圖片對(duì)應(yīng)標(biāo)簽組成,其中標(biāo)簽是若干個(gè)n一個(gè)y組成的字符串,字母y出現(xiàn)的位置就是圖片對(duì)應(yīng)的類型。
可以看出這張圖中的裙子是長裙,對(duì)應(yīng)上官方的說明,可以發(fā)現(xiàn)與標(biāo)記吻合。接下來,我們就準(zhǔn)備好訓(xùn)練集和測試集的目錄,以及6個(gè)裙子類別對(duì)應(yīng)的子目錄。
運(yùn)行后的目錄結(jié)構(gòu)如下:
要想處理其他類型的服飾,只需要將task變量指定為對(duì)應(yīng)的服飾類型名稱就行了。最后,我們將圖片復(fù)制到各自對(duì)應(yīng)的目錄中。需要注意的是,這里我們刻意隨機(jī)打亂了圖片的順序,從而防止訓(xùn)練集與測試集切分不均勻的情況出現(xiàn)。
遷移學(xué)習(xí)
數(shù)據(jù)準(zhǔn)備完畢,接下來我們可以開始著手設(shè)計(jì)算法了。
服裝的識(shí)別可以被視作計(jì)算機(jī)視覺中的經(jīng)典問題:圖片分類。一個(gè)典型的例子是ImageNet數(shù)據(jù)集與ILSVRC競賽,其中選手們要為分別從屬于1000個(gè)類別的逾1400萬張圖片設(shè)計(jì)算法,將它們準(zhǔn)確分類。在服飾屬性判別競賽中,我們可以認(rèn)為不同屬性的服飾從屬于不同的類別,于是便能參考ImageNet中的優(yōu)勝算法來參賽。
在初賽階段,主辦方給每類服飾各提供了約一萬張圖片用來訓(xùn)練,這樣的數(shù)據(jù)量還不足以讓我們從零開始訓(xùn)練一個(gè)很棒的深度學(xué)習(xí)模型。于是我們可以借用遷移學(xué)習(xí)的想法,從一個(gè)在ImageNet數(shù)據(jù)集上被訓(xùn)練好的模型出發(fā),一點(diǎn)點(diǎn)把它改造成“更懂衣服”的模型。如下圖所示,左邊的是在ImageNet數(shù)據(jù)集上訓(xùn)練好的網(wǎng)絡(luò),右邊的是我們即將用來參賽的網(wǎng)絡(luò),這兩個(gè)網(wǎng)絡(luò)主體結(jié)構(gòu)一致,因此我們可以將主要的網(wǎng)絡(luò)權(quán)重都復(fù)制過來。因?yàn)閮蓚€(gè)網(wǎng)絡(luò)在輸出層的分類個(gè)數(shù)與含義都不一樣,我們需要將輸出層重新定義并隨機(jī)初始化。
在ImageNet數(shù)據(jù)集上,大家主要用卷積神經(jīng)網(wǎng)絡(luò),而在過去的幾年中也出現(xiàn)了很多不同的網(wǎng)絡(luò)架構(gòu)。gluon官方提供了許多不同的預(yù)訓(xùn)練好的卷積神經(jīng)網(wǎng)絡(luò)模型,我們?cè)谶@個(gè)比賽中選擇效果比較好的resnet50_v2模型作為訓(xùn)練的出發(fā)點(diǎn)。關(guān)于遷移學(xué)習(xí)更詳細(xì)的介紹可以參考gluon中文教程中的Fine-tuning:通過微調(diào)來遷移學(xué)習(xí)[6]一節(jié)。
首先,我們準(zhǔn)備好需要用到的環(huán)境。
下面我們可以一句話導(dǎo)入預(yù)訓(xùn)練好的resnet50_v2模型。如果是首次導(dǎo)入模型,代碼會(huì)需要一點(diǎn)時(shí)間下載預(yù)訓(xùn)練好的模型。
在ImageNet上訓(xùn)練的模型輸出是1000維的,我們需要定義一個(gè)新的resnet50_v2網(wǎng)絡(luò),其中
輸出層之前的權(quán)重是預(yù)訓(xùn)練好的
輸出是6維的,且輸出層的權(quán)重隨機(jī)初始化
之后,我們可以根據(jù)具體的機(jī)器環(huán)境選擇將網(wǎng)絡(luò)保存在CPU或者是GPU上。
在上面代碼中的最后一行我們調(diào)用了hybridize,這是gluon的主要特性之一,能將命令式編程構(gòu)建的模型在執(zhí)行時(shí)把大部分運(yùn)算轉(zhuǎn)成符號(hào)式來執(zhí)行,這樣一方面提高了開發(fā)效率,同時(shí)也保證了運(yùn)行速度。關(guān)于hybridize更詳細(xì)的介紹可以參考gluon中文教程中的Hybridize:更快和更好移植[7]一節(jié)。
接下來我們定義幾個(gè)輔助函數(shù),它們分別是
計(jì)算AveragePrecision,官方的結(jié)果評(píng)價(jià)標(biāo)準(zhǔn)。
訓(xùn)練集與驗(yàn)證集的圖片增廣函數(shù)。
每輪訓(xùn)練結(jié)束后在測試集上評(píng)估的函數(shù)
關(guān)于圖片增廣更詳細(xì)的介紹可以參考中文教程中的圖片增廣[8]一節(jié)。
下面我們定義一些訓(xùn)練參數(shù)。注意,在遷移學(xué)習(xí)中,我們一般認(rèn)為整個(gè)網(wǎng)絡(luò)的參數(shù)不需要進(jìn)行很大地改動(dòng),只需要在訓(xùn)練數(shù)據(jù)上微調(diào),因此我們的學(xué)習(xí)速率都設(shè)為一個(gè)比較小的值,比如0.001。
為了方便演示,我們只循環(huán)兩輪訓(xùn)練,展示過程。
接下來我們可以讀入數(shù)據(jù)了。經(jīng)過之前的整理,數(shù)據(jù)可以用接口gluon.data.DataLoader讀入
下面我們定義網(wǎng)絡(luò)的優(yōu)化算法和損失函數(shù)。這次比賽中我們選用隨機(jī)梯度下降就能得到比較好的效果。分類問題一般用交叉熵作為損失函數(shù),另外,我們除了mAP指標(biāo)之外也關(guān)心模型的準(zhǔn)確率。
至此萬事俱備,我們可以開始訓(xùn)練了!再次提醒,這里為了快速演示,我們只做兩次循環(huán),為了達(dá)到更好的訓(xùn)練效果請(qǐng)記得將epochs調(diào)大。
訓(xùn)練結(jié)束了,那效果怎么樣呢?我們可以直接拿幾張測試集的圖片出來,用人眼對(duì)比一下看看預(yù)測的類型是否準(zhǔn)確。
可以看到,雖然只有兩輪訓(xùn)練,但我們的模型在展示的幾張圖片上都做出了正確的預(yù)測。
總結(jié)
至此,我們展示了從數(shù)據(jù)整理直到作出預(yù)測的樣例代碼。你可以從這里開始,不斷地改進(jìn)代碼,向著更好的結(jié)果出發(fā)。也建議大家去下載FashoinAI數(shù)據(jù)集,直接用實(shí)踐本文中所學(xué)習(xí)到的技巧。下面我們給出一些可以改進(jìn)的方向,你可以從他們開始著手:
1.調(diào)整參數(shù),比如學(xué)習(xí)速率,批量大小,訓(xùn)練循環(huán)次數(shù)等。
參數(shù)之間是有互相影響的,比如更小的學(xué)習(xí)速率可能意味著更多的循環(huán)次數(shù)。
建議以驗(yàn)證集上的結(jié)果來選擇參數(shù)
不同數(shù)據(jù)的最佳參數(shù)可能是不一樣的,建議對(duì)每個(gè)任務(wù)選取相應(yīng)的最佳參數(shù)
2.選擇模型。除了ResNet模型之外,gluon還提供很多其他流行的卷積神經(jīng)網(wǎng)絡(luò)模型,可以到官方文檔根據(jù)它們?cè)贗mageNet上的表現(xiàn)進(jìn)行選擇。
在計(jì)算資源有限的情況下,可以考慮選用占內(nèi)存更小、計(jì)算速度更快的模型。
3.更全面的圖片增廣可以考慮在訓(xùn)練時(shí)加上更多的圖片操作。image.CreateAugmenter函數(shù)有很多其他的參數(shù),不妨分別試試效果。
在預(yù)測時(shí)將預(yù)測圖片做不同的裁剪/微調(diào)并分別預(yù)測,最后以平均預(yù)測值為最后答案,可以得到更穩(wěn)健的結(jié)果。
特別感謝:作者/亞馬遜主任科學(xué)家 李沐
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4734瀏覽量
100420 -
AI
+關(guān)注
關(guān)注
87文章
29824瀏覽量
268116 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5466瀏覽量
120891
原文標(biāo)題:MXNet 作者李沐:用深度學(xué)習(xí)做圖像分類,教程+代碼
文章出處:【微信號(hào):AI_era,微信公眾號(hào):新智元】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論