轉(zhuǎn)型AI的勵志故事,從非科班到拿下阿里云棲一等獎,他經(jīng)歷的坑足夠你學(xué)習(xí)100天
深度學(xué)習(xí)正在從實驗室下沉到技術(shù)一線。“年薪百萬”的人才需求背后,是各用人團(tuán)隊找不出可用之才的窘境,同時也說明廣大有志于AI的人才沒能迅速掌握深度學(xué)習(xí)。背后的原因,恐怕是深度學(xué)習(xí)的實用性太過超前,創(chuàng)造出深度學(xué)習(xí)的這批大牛還沒來得及培養(yǎng)接班梯隊便已撲向技術(shù)一線,而立足于一線工作技術(shù)人才在學(xué)習(xí)過程中往往又要重新去趟坑。
如何處理這一環(huán)節(jié)上的反復(fù),是當(dāng)前AI人才培養(yǎng)難題上的一大關(guān)鍵。11 月份《程序員》雜志的“AI工程師職業(yè)指南”特地請來AI各領(lǐng)域技術(shù)一線的專家,希望他們能把成功經(jīng)驗和學(xué)習(xí)方法詳細(xì)而走心地分享給有志于此的技術(shù)人才,讓大家在做規(guī)劃時,可以用上更為合理的學(xué)習(xí)路徑。
其中,智亮老師的一篇《實戰(zhàn)路徑:程序員的機(jī)器學(xué)習(xí)進(jìn)階方法》,是根據(jù)他痛苦的轉(zhuǎn)型經(jīng)歷來告訴大家——一個非科班出身的程序員是如何一步一步踏上深度學(xué)習(xí)這條不歸路,并開發(fā)出一款榮獲阿里云棲大會API Solution一等獎的植物識別App。
在這過程中,如何選擇入門課程?如何選擇深度學(xué)習(xí)框架及編程語言?如何上手?jǐn)?shù)據(jù)?如何配置一臺能運(yùn)行深度學(xué)習(xí)的電腦并跑出你的第一個模型?以下為智亮的正文分享,你可以清晰地看到他趟過的每一個坑,希望借他的肩,讓你勇敢前行。
在計算機(jī)行業(yè),關(guān)于從業(yè)人員的素質(zhì),一直都有一個樸素的認(rèn)識——科班出身好過非科班,學(xué)歷高的好過學(xué)歷低的。大部分時候,這個看法是對的。在學(xué)校學(xué)習(xí),有老師指點,有同學(xué)討論,有考試壓迫,有項目練手。即便不大用心的學(xué)生,幾年耳濡目染下來,畢業(yè)后作為半個專業(yè)人士,還是沒什么問題的。
不過,量子物理告訴我們,這個世界的本質(zhì)要看概率。所以,科班出身的同學(xué),在技術(shù)上好過非科班出身的同學(xué),這是大概率事件;相反,非機(jī)器學(xué)習(xí)專業(yè),甚至非計算機(jī)專業(yè)的同學(xué),在這個領(lǐng)域做的比本專業(yè)同學(xué)更好,則就是小概率事件了。但小概率事件并非“不可能事件”,國內(nèi)很多做機(jī)器學(xué)習(xí)公司的CTO,都不是機(jī)器學(xué)習(xí)專業(yè)的科班出身,卻能夠抓住這里的“小概率”,讓自己華麗地轉(zhuǎn)身并實現(xiàn)彎道超車。
他們是怎么做到的?
如果在上學(xué)的時候,我們沒能嗅到機(jī)器學(xué)習(xí)領(lǐng)域的機(jī)會,而是選擇其他領(lǐng)域來學(xué)習(xí)和工作……如今卻打算半路出家、改行機(jī)器學(xué)習(xí),應(yīng)該怎么做,才能做到跟這些人一樣好?或者,至少是足夠好?
我自己痛苦轉(zhuǎn)型的經(jīng)歷,說出來可以供大家參考一下。
我也是非科班出身,但因為工作,一直需要接觸計算機(jī)視覺的一些傳統(tǒng)算法。后來,看到ImageNet競賽的結(jié)果,我意識到了深度學(xué)習(xí)在視覺領(lǐng)域的巨大優(yōu)勢,遂決定開始轉(zhuǎn)型深度學(xué)習(xí)和神經(jīng)網(wǎng)絡(luò),走上了這條學(xué)習(xí)的不歸路(笑)。
想要轉(zhuǎn)型,跟上學(xué)的時候不同,因為手頭正在做的工作意味著,自己需要從沒有時間的情況下擠出時間,需要把別人睡覺、打游戲的時間用來學(xué)習(xí),而所學(xué)的又是一種頗為艱深晦澀的學(xué)問。
轉(zhuǎn)型,其實很容易,需要做到的只有一件事:學(xué)習(xí)。
轉(zhuǎn)型,其實很困難,因為必須做到一件事:堅持學(xué)習(xí)。
最難的不是下定決心,而是貫徹到底。所以,在開始之前,不妨先問問自己這樣幾個問題:
- “我真的已經(jīng)想清楚,要踏足這個行業(yè)嗎?”
- “我能夠付出比其他人更多的辛苦汗水,在這條路上堅定地走下去嗎?”
- “在遭受了痛苦甚至打擊之后,我對機(jī)器學(xué)習(xí)的熱愛,仍然能夠維持我繼續(xù)前進(jìn)嗎?”
根據(jù)我掌握的數(shù)據(jù),100個程序員里大概有30個考慮過轉(zhuǎn)型,而真正付諸行動的不過10個。一個月以后仍然在堅持的僅有5個,最終能完成第一個階段學(xué)習(xí)的,最多兩三個而已。
真的這么困難嗎?是的。特別是你要白天上班,晚上才能學(xué)習(xí),獨學(xué)而無友,有問題又只能自己查。而要系統(tǒng)地入門,又不是咬牙一天兩天就能學(xué)出來,恐怕得堅持幾個月才能get到點。
我個人的經(jīng)歷是這樣:一開始接觸時,每周一、三、五固定3天時間,每晚花兩個小時去學(xué)習(xí)、看視頻、翻書,周六周日則用來完成課程附帶的編程作業(yè),大概也是每天兩小時左右。在這種強(qiáng)度下堅持了三個月,我才算是完成了入門的第一步。
也許有的人效率更高一些,也許有的人步子更慢一些,但快和慢不是關(guān)鍵,即使學(xué)習(xí)最慢的人,也要比一開始放棄學(xué)習(xí)的人走得更遠(yuǎn)。
所以,其實真正重要的,不是“我該學(xué)什么”,或者“我該怎么學(xué)”;而是“我是不是真的有足夠的決心”,以及“我是不是能堅持到底”。
上手的課程
定好決心后,我們就能看看:在學(xué)機(jī)器學(xué)習(xí)的時候,我們到底在學(xué)什么?
幾乎所有人都知道人工智能這個概念;有一部分人知道“機(jī)器學(xué)習(xí)”這個概念;其中一小部分人能清楚描述“深度學(xué)習(xí)”、“機(jī)器學(xué)習(xí)”和“神經(jīng)網(wǎng)絡(luò)”的關(guān)系; 很少一部分人能夠正確說明“卷積”、“池化”、“CTC”這些名詞的正確含義與計算/實現(xiàn)的方法;非常少的人能清楚地理解損失函數(shù)和反向傳播的數(shù)學(xué)表達(dá);極少極少的人能夠闡述網(wǎng)絡(luò)的一個修改(比如把卷積核改小)對precision/recall會產(chǎn)生什么影響;幾乎沒有人能描述上述影響到底是什么原理。
這就是目前“程序員”這個群體,對于機(jī)器學(xué)習(xí)的了解程度。
我個人的經(jīng)驗,適用于“很少一部分人”之外的那“很大一部分人”,也就是說,他們最多知道深度學(xué)習(xí)是什么意思,神經(jīng)網(wǎng)絡(luò)又是什么概念,卻并未真正系統(tǒng)地學(xué)習(xí)接觸過這個領(lǐng)域。
而我們的目標(biāo),則定位成為“非常少的人”,也就是能夠理解損失函數(shù)/反向傳播這些較為基礎(chǔ)、較為底層的知識,使得自己能夠設(shè)計新的算法或網(wǎng)絡(luò),或至少能輔助大牛去實現(xiàn)他們所設(shè)想的算法和神經(jīng)網(wǎng)絡(luò)。
要實現(xiàn)這個小目標(biāo),我們就必須掌握最基礎(chǔ)的知識,就好像學(xué)寫漢字時,不練橫豎撇捺折是不現(xiàn)實的。
但是,作為“不明真相的廣大群眾”,從哪里入手好呢? 線性代數(shù)?概率論?那是最糟糕的選擇!它們只會讓你入門之前就徹底喪失信心,其漫長而陡峭的學(xué)習(xí)曲線還會讓你誤以為這是一個不友好的領(lǐng)域。事實上,只有成為“很少一部分人”(能夠正確說明“卷積”,“池化”,“CTC”這些名詞的正確含義和計算/實現(xiàn)方法)之后,你才真正需要去復(fù)習(xí)它們。
在這之前,你所要用到的數(shù)學(xué)知識,只有以下這三點:
1. 懂得矩陣運(yùn)算的基本計算方法,能夠手動計算[3×4]×[4×3]的矩陣,并明白為什么會得到一個[3×3]的矩陣。
2. 懂得導(dǎo)數(shù)的基本含義,明白為什么可以利用導(dǎo)數(shù)來計算梯度,并實現(xiàn)迭代優(yōu)化。
3. 能夠計算基本的先驗及后驗概率。
只要大學(xué)考試不是完全靠抄答案,稍微翻翻書,你就能把這點知識找回來,可能半天都用不上。
然后就可以入門了,對于所有零基礎(chǔ)的同學(xué),我都建議從吳恩達(dá)的機(jī)器學(xué)習(xí)課程開始: Machine Learning - Stanford University | Coursera
吳恩達(dá)的英語又慢又清晰,課程字幕的翻譯又到位,課程設(shè)置與課中測驗及時而又合理,重點清晰、作業(yè)方便,再加上吳恩達(dá)教授深入淺出的講解,講解過程中不時的鼓勵和調(diào)侃,都能讓你更為積極地投入到機(jī)器學(xué)習(xí)的學(xué)習(xí)之中,讓你扎實而快速地掌握機(jī)器學(xué)習(xí)的必備基礎(chǔ)知識。
這門在線課程,相當(dāng)于斯坦福大學(xué)CS229的簡化版,涵蓋內(nèi)容包括機(jī)器學(xué)習(xí)最基礎(chǔ)的知識、概念及其實現(xiàn),以及最常用的算法(例如PCA、SVM)和模型(全連接神經(jīng)網(wǎng)絡(luò))。學(xué)習(xí)這門課程,重要的是基礎(chǔ)的概念與實現(xiàn)。作為一名具備編程基礎(chǔ)的開發(fā)人員,在這個階段要將自身理論同實踐相結(jié)合的優(yōu)勢發(fā)揮出來,充分利用它所提供的編程作業(yè),盡可能多地實踐,從理論和代碼兩個角度去理解課程中的知識點。
學(xué)習(xí)完成后,你能了解到機(jī)器學(xué)習(xí)的一些基本名詞和概念,并具備一定的算法層面的編碼能力。打好理論和實踐的基礎(chǔ),你就可以進(jìn)行下一階段的學(xué)習(xí)了,其中有兩大的方向:夯實基礎(chǔ)和選擇領(lǐng)域。
夯實基礎(chǔ)的意思,就是這門課的完成,并不代表自己學(xué)會了機(jī)器學(xué)習(xí),只不過是從門外漢進(jìn)了一步,一只腳踏進(jìn)了門,但其實也僅僅是一些基本的了解。這個時候,你也許會覺得自己有很多的奇思妙想,卻難以評估這些想法的價值和正確的可能性,這就是基礎(chǔ)不夠的緣故。
所以,在繼續(xù)學(xué)習(xí)深度神經(jīng)網(wǎng)絡(luò)之前,建議結(jié)合自己所學(xué)到的知識,回頭去看一遍CS229,將傳統(tǒng)算法整體熟悉一遍,盡可能把所有的基本概念都掌握扎實。
而選擇領(lǐng)域,則是由于任務(wù)目標(biāo)的不同,深度學(xué)習(xí)領(lǐng)域已在大體上分成了計算機(jī)視覺(CV)、自然語言處理(NLP)以及其他一些子領(lǐng)域,例如語音和更為特殊的強(qiáng)化學(xué)習(xí)等。在每個領(lǐng)域下,都有大量的研究者在投入精力鉆研,發(fā)表論文和成果??紤]到個人精力的限度,建議選擇一到兩個方向作為主攻,跟上學(xué)術(shù)界主流的進(jìn)展,其他子領(lǐng)域有基礎(chǔ)的了解即可,必要時作為參考即可。
在完成了相應(yīng)領(lǐng)域的學(xué)習(xí)后,下一步要做的就是嘗試閱讀最新的經(jīng)典論文并試圖復(fù)現(xiàn)它們了。
編程語言與深度學(xué)習(xí)框架的選擇
當(dāng)然,作為開發(fā)者,想要去實現(xiàn)一個模型,繞不開的問題便是:
應(yīng)該選擇什么語言?應(yīng)該選擇什么框架?
對于開發(fā)人員而言,語言的選擇其實不是問題。但作為入門,最為理所當(dāng)然的建議則是Python,原因也非常簡單:Python最好學(xué)。
對于機(jī)器學(xué)習(xí)的學(xué)習(xí),使用Python就意味著你不必分心去學(xué)習(xí)那些復(fù)雜的數(shù)據(jù)類型約束以及轉(zhuǎn)化、指針、內(nèi)存管理或垃圾收集之類的“高級”(一般同時也代表著復(fù)雜)的特性,將精力集中在自己的目標(biāo)上。當(dāng)然,一些Python特有的方法(如lambda、yield或reduce)以及工具(如NumPy、pandas),還是需要多多使用,盡快熟練。
而框架方面,從使用者的維度去劃分,當(dāng)前數(shù)量非常之多的機(jī)器學(xué)習(xí)框架,則可大體上分為兩大陣營。
- 學(xué)術(shù)友好型: Theano、Torch與Caffe
學(xué)術(shù)研究時,弄出來一個新模型、新算法、新函數(shù)是常有的事,做出新的突破也是學(xué)術(shù)研究最基本的要求。所以,這些框架通常都便于定制模型,也可深入修改內(nèi)部實現(xiàn)。很多新成果都會在發(fā)表論文的同時,提供這些框架上的實現(xiàn)代碼以供參考。它們在性能方面也比較出色。
其代價就是,要么是使用了困難(Caffe:C++)或小眾(Torch:Lua)的開發(fā)語言,要么是有一些古怪的缺點(Theano:編譯超級慢)。
而且,這些框架似乎都沒怎么考慮過“怎么提供服務(wù)”的問題。想要部署到服務(wù)器上?Caffe已算是最簡單的了,但仍要經(jīng)歷漫長而痛苦的摸索歷程。
- 工業(yè)友好型: Tensorflow、MXNet與Caffe
工業(yè)上往往更注重“把一個東西做出來,并且讓它運(yùn)行得良好”。所以這些框架首先就需要支持并行訓(xùn)練。其中Tensorflow和MXNet支持多機(jī)多卡、單機(jī)多卡、多機(jī)單卡并行,Caffe則支持單機(jī)多卡,雖然性能還不是特別理想。
在我們的測試中,Tensorflow的雙卡并行只能達(dá)到單卡的1.5倍左右性能,卡越多,這個比例越低。Caffe要好一些,但參數(shù)同步和梯度計算無論如何也都需要時間,所以沒有哪個框架能在沒有性能損失的情況下實現(xiàn)擴(kuò)展。而多機(jī)情況下,性能損失更大,很多時候都讓人感到無法接受。
相對來說,只有Tensorflow提供了比較好的部署機(jī)制(Serving),并且有直接部署到移動端的方案。而MXNet和Caffe則是直接編譯的方式,雖然也能實現(xiàn),但是說實話,依然很麻煩。
至于缺點,除Caffe之外,其他兩種框架對于學(xué)術(shù)界動態(tài)的跟蹤都不太緊,Tensorflow到現(xiàn)在都沒有PReLU的官方實現(xiàn),前不久才剛推出一系列檢測(Detection)的模型。MXNet這一點上要積極些,可是受限于較小的開發(fā)者社區(qū),很多成果都只能等待大神們的contribution,或是自行實現(xiàn)。
這樣看來,難道最好的框架是Caffe?既能兼顧學(xué)術(shù)和實現(xiàn),又能兼?zhèn)潇`活性和性能兼?zhèn)?hellip;…說實話,我的確是這么認(rèn)為的。但前提是你懂C++,如果出身不是C++開發(fā)人員,相信我,這門語言也不比機(jī)器學(xué)習(xí)容易多少。
所以,對于大多數(shù)有志于投身于機(jī)器學(xué)習(xí)開發(fā)(而非研究)的同學(xué)們來說,我推薦首選Tensorflow作為你的第一個開發(fā)框架。除了上述的優(yōu)點之外,最主要的因素是它人氣高。遇到任何問題,你都可以找到一群志同道合的伙伴們?nèi)プ稍儯蚴且黄鹧芯?。對于初學(xué)者而言,其重要程度不言而喻。
- 實戰(zhàn)上手的數(shù)據(jù)
上過課程、學(xué)好語言、裝好框架之后,自然就要通過親手編程,來把自己的模型實現(xiàn)出來。
但在深度學(xué)習(xí)領(lǐng)域,沒有數(shù)據(jù)的模型就是無源之水,毫無價值。而目前流行的監(jiān)督學(xué)習(xí),要求必須有足夠的帶標(biāo)注數(shù)據(jù)來作為訓(xùn)練數(shù)據(jù)。那么,從哪里能得到這樣的數(shù)據(jù)以進(jìn)行學(xué)習(xí)呢?答案就是公開數(shù)據(jù)集。
例如,在學(xué)習(xí)論文時,如果它提出了一個性能優(yōu)異的模型或者方法,通常會附有在幾個公開的標(biāo)準(zhǔn)數(shù)據(jù)集上的成績,這些標(biāo)準(zhǔn)數(shù)據(jù)集就是可以去下載來學(xué)習(xí)和使用的資源。另外,諸如Kaggle和天池之類的機(jī)器學(xué)習(xí)競賽,其比賽項目中也會提供很多數(shù)據(jù)集供學(xué)習(xí)和測試。這些就是學(xué)習(xí)階段的主要數(shù)據(jù)來源。
以CV領(lǐng)域為例,常見的公開數(shù)據(jù)集就包括以下這些。
- MNIST
不論選擇哪本教材、哪個框架,在剛剛接觸機(jī)器學(xué)習(xí)的時候,一定會接觸到MNIST。它是由Yann LeCun所建立的手寫數(shù)字庫,每條數(shù)據(jù)是固定的784個字節(jié),由28x28個灰度像素組成,大概長成這樣:
目標(biāo)是對輸入進(jìn)行10-分類,從而輸出每個手寫數(shù)字所表示的真實數(shù)字。
因為它體積小(10M左右)、數(shù)據(jù)多(6萬張訓(xùn)練圖片)、適用范圍廣(NN/CNN/SVM/KNN都可以拿來跑跑)而聞名天下,其地位相當(dāng)于機(jī)器學(xué)習(xí)界的Hello World。在LeCun的MNIST官方網(wǎng)站上(yann.lecun.com/exdb/mnist/),還貼有各種模型跑這個數(shù)據(jù)集的最好成績,當(dāng)前的最好得分是CNN的,約為99.7%。
由于該數(shù)據(jù)集非常之小,所以即便是在CPU上,也可以幾秒鐘就跑完NN的訓(xùn)練,或是幾分鐘跑完一個簡單的CNN模型。
- CIFAR
而打算從圖像方面入手的同學(xué),CIFAR數(shù)據(jù)庫(官網(wǎng):www.cs.toronto.edu/~kriz/cifar.html)則是一個更好的入門選項。
該數(shù)據(jù)庫分為2個版本,CIFAR-10和CIFAR-100。顧名思義,CIFAR-10有10個分類,每個分類有5000張訓(xùn)練圖片和1000張測試圖片,每張圖片是32x32像素的3通道位圖,如圖2所示。
而CIFAR-100則有100個分類,每個分類變成500張訓(xùn)練圖片與100張測試圖片,但圖片的大小并沒有什么變化。
之所以它比MNIST更適合作為圖片處理的入門,是因為它盡管分辨率較低,但卻是三通道、真實拍攝的照片。其中有些圖片的背景還略微復(fù)雜,更貼近我們真實的圖片處理場景。相對而言,MNIST的灰度輸入和干凈背景就顯得過于簡單,況且99.7%的準(zhǔn)確率也確實難有提升的空間。
Tensorflow給出了CIFAR的例程:
https://www.tensorflow.org/tutorials/deep_cnn
并附有代碼:
https://github.com/tensorflow/models/tree/fb96b71aec356e054678978875d6007ccc068e7a/tutorials/image/cifar10
- ImageNet和MS COCO
至于ImageNet(www.image-net.org/)和COCO(http://mscoco.org/),則是兩個工業(yè)級別的圖像數(shù)據(jù)集。通常提到它們時,ImageNet指的是ILSVRC2012的訓(xùn)練集,而COCO則是COCO-2014訓(xùn)練集。
ImageNet有大量的圖片(一百多萬張,分成1000個分類)和標(biāo)注,大部分都是圖3這樣的。
COCO雖然圖片數(shù)量少一些(8萬多張,80個分類),但每張圖片都有輪廓標(biāo)記,并且附帶分類標(biāo)注和5句描述話語(英文)。其圖片大致如圖4。
所以當(dāng)我們進(jìn)入實際工作的階段,就要根據(jù)具體的需要從中選擇適合自己的數(shù)據(jù)集,以作為benchmark或是pretrain數(shù)據(jù)集。
實戰(zhàn)階段的學(xué)習(xí)用機(jī)配置
接下來,我們就需要一臺機(jī)器來把框架搭建起來,以編寫和運(yùn)行我們的helloAI。然而,我在很多地方都看到小伙伴們在問:
- 我需要什么樣的配置能學(xué)機(jī)器學(xué)習(xí)?
- 我需要買塊GTX1080/TITAN/Tesla嗎?
- 我應(yīng)該裝幾塊顯卡?一塊?兩塊?還是四塊?
而答案也往往傾向于:
“必須得有GPU啊,至少1080,沒有四路Titan你都不好意思跟人打招呼!”
其實,并不完全是這樣。
如果僅僅是入門和學(xué)習(xí),CPU或GPU完全不影響你對代碼和框架的學(xué)習(xí)。運(yùn)行MNIST或CIFAR之類的玩具數(shù)據(jù)集,它們的差距并不大。以我的機(jī)器為例,運(yùn)行自帶的CIFAR demo,i7 CPU和GTX 1080 Ti的速度分別是770 pics/s和2200 pics/s。GPU大概有不到三倍的性能優(yōu)勢。所以,差距其實也沒多大。
這里還有一個小竅門,就是想用CPU版本的Tensorflow,最好不要用pip下載的方式,而是自行編譯。因為在開發(fā)機(jī)上編譯時,它會自動打開所有支持的加速指令集(SSE4.1/SSE4.2/AVX/AVX2/FMA),從而使CPU的運(yùn)算大大加快。根據(jù)我們的測試,在打開全部加速指令集的情況下,訓(xùn)練速度大概會有30%的提升,而預(yù)測的速度大概能提升一倍。
當(dāng)然,如果真想用一個復(fù)雜模型去處理實際的生產(chǎn)問題,模型的復(fù)雜度和數(shù)據(jù)量都不是CIFAR這樣的玩具數(shù)據(jù)集可以比擬的。如果用我們的一個生產(chǎn)模型來運(yùn)行CIFAR數(shù)據(jù)集,其他參數(shù)和條件完全相同,它在i5/i7/960/GTX1080/GTX1080Ti下的速度分別是:19/25/140/460/620(單位pics/s,越大越好)。這里就能看出差距了,1080Ti大概是i7 CPU的25倍。而在模型上線使用(inference)時,GPU也會有10-20倍的性能優(yōu)勢。模型越復(fù)雜,GPU的優(yōu)勢越明顯。
綜合來看,如果僅僅是入門時期的學(xué)習(xí),我建議先不用專門購買帶GPU的機(jī)器;而是先用你現(xiàn)有的機(jī)器,使用CPU版本,去學(xué)習(xí)框架和一些基礎(chǔ)。等到你對基礎(chǔ)已經(jīng)掌握得比較扎實,那么自然就會形成跑一些更復(fù)雜的模型和更“真實”的數(shù)據(jù)的想法,這時候再考慮買一塊GPU,以縮短訓(xùn)練時間。
在選GPU時,我聽過一些朋友們推薦GTX1070×2這樣的選擇。理論上講,1070的性能大概能達(dá)到1080的75%,而價格只有1080的一半,從各個方面看,似乎都是雙1070更有優(yōu)勢。然而不要忘記,雙卡的性能是不可能達(dá)到單卡的2倍的,在目前的Tensorflow上,大概只能達(dá)到1.5倍上下,算下來其實和1080單卡差不多。而雙顯卡的主板、電源與機(jī)箱散熱都需要做更多的考慮,從性價比上來看,未必真的劃算。
不過,如果顯卡預(yù)算剛好卡在5000-6000的檔位,雙1070也有它的優(yōu)勢。比如,可以學(xué)習(xí)使用多顯卡并行計算的用法,在不著急的時候可以用兩塊顯卡同時跑兩個不同的任務(wù),合并起來就相當(dāng)于有了16G的顯存等等。考慮到這些因素,雙1070的確是最適合入門學(xué)習(xí)的選擇——如果買不起雙1080/雙TITAN的話(笑)。
如果你有打算用筆記本來作為主力學(xué)習(xí)用機(jī),我的建議是:最好不要,除非你使用Linux的經(jīng)驗很豐富,或是不打算用GPU加速。很多筆記本在安裝Liunx后會出現(xiàn)驅(qū)動方面的問題,而且使用GPU加速時的高熱量也會非常影響系統(tǒng)的穩(wěn)定性。如果沒有很豐富的經(jīng)驗,經(jīng)常會在一個小問題上卡掉幾個小時寶貴的學(xué)習(xí)時間。
然后,要不要來試試第一個模型?
在Tenforflow安裝完成后,我們可以用這種方式來最快地把第一個CIFAR demo跑起來:
OK,只需幾分鐘來下載數(shù)據(jù),我們就能看到我們的第一個“圖像識別模型”正在訓(xùn)練了。
訓(xùn)練過程中我們可以看到log中在不斷地輸出loss信息,但除了想要跟蹤loss之外,我們還希望看到當(dāng)前訓(xùn)練模型的識別準(zhǔn)確率到底如何,這就不是cifar10_train.py這個腳本能夠提供的了。我們還需要執(zhí)行
這個腳本會不斷地驗證最近的檢查點的識別準(zhǔn)確率。
如果使用GPU的話,就會發(fā)現(xiàn)訓(xùn)練腳本運(yùn)行起來之后,所有的顯存都已被這個進(jìn)程占滿;再啟動驗證腳本的話,就會報錯一大堆的內(nèi)存不足(OOM),這是Tensorflow的機(jī)制決定的,它會默認(rèn)占據(jù)所有顯卡的所有顯存,而不管自己是否真能用到那么多。
解決這個問題的辦法也很簡單。
首先,我們可以指定Tensorflow使用哪幾塊顯卡進(jìn)行訓(xùn)練。要做到這一點,可以在執(zhí)行較本前,用命令行指定環(huán)境變量:
其中的“0,2”就是希望使用的GPU編號,從0開始,用逗號分隔開。
或者在代碼中創(chuàng)建一個GPUOption,設(shè)置visible_device_list=‘0,2’,也能起到同樣的效果。
然后,我們還可以限制Tensorflow所用的顯存,使其動態(tài)增長而非一啟動就占滿。方法和上面的類似,在代碼中創(chuàng)建一個GPUOption,并設(shè)置allow_growth=True即可。
官方的CIFAR例程大概能達(dá)到86%的準(zhǔn)確率,這個成績在現(xiàn)在來說可以算是比較差的,最新模型的準(zhǔn)確率通常都在97%左右,即便不經(jīng)仔細(xì)調(diào)參而隨意訓(xùn)練也能輕松達(dá)到93%左右。大家可以嘗試修改cifar10.py中定義的模型,以得到更好的效果。
最后,也是最初
在經(jīng)歷過如此漫長、痛苦但也充滿樂趣的學(xué)習(xí)和實踐之后,你應(yīng)該可以算是機(jī)器學(xué)習(xí)的一個業(yè)內(nèi)人士了。但這并不意味這條道路已經(jīng)走到了盡頭,恰恰相反,在完成這一切之后,你才剛剛踏出了機(jī)器學(xué)習(xí)從業(yè)生涯的第一步。
在目前這個階段,業(yè)內(nèi)還處于算法紅利期,新的算法、新的模型層出不窮,僅僅在CV領(lǐng)域,每天就有二三十篇paper被發(fā)布到arXiv上,每年的頂會頂刊收錄的成果都在大幅度刷新上一年甚至上一個月的記錄。
打好基礎(chǔ)之后,跟蹤論文并復(fù)現(xiàn)、學(xué)習(xí)和思考,這樣的任務(wù)將成為你現(xiàn)階段的一項日常作業(yè),如果你已經(jīng)進(jìn)入或是決定進(jìn)入這個行業(yè)的話。因為稍有懈怠,便要面臨著被時代拋棄、跟不上節(jié)奏的情況。所以,到這一步,對于有些人來說是一個結(jié)束,而對另一些人來說,則才剛剛是開始。
這個時候,我們可以回過頭來重新問問自己前面那幾個問題:
- “我真的已經(jīng)想清楚,要踏足這個行業(yè)嗎?”
- “我能夠付出比其他人更多的辛苦汗水,在這條路上堅定地走下去嗎?”
- “在遭受了痛苦甚至打擊之后,我對機(jī)器學(xué)習(xí)的熱愛,仍然能夠維持我繼續(xù)前進(jìn)嗎?”
這條路,我在走,很多人在走,那么,你來嗎?