常見(jiàn)深度學(xué)習(xí)框架對(duì)比

本文轉(zhuǎn)自陳云的《深度學(xué)習(xí)框架PyTorch:入門(mén)與實(shí)踐》仪缸。感覺(jué)現(xiàn)在還很難說(shuō)哪個(gè)深度學(xué)習(xí)框架更好(只有更流行的)谤狡。開(kāi)發(fā)caffe的賈清揚(yáng)被阿里從Facebook挖跑了净神,賈清揚(yáng)應(yīng)該是在Facebook開(kāi)發(fā)出來(lái)caffe2沒(méi)多長(zhǎng)時(shí)間,貌似至少是在Facebook里琅豆,pytorch把caffe干趴下了牌里。去年google在上海的開(kāi)發(fā)者大會(huì)強(qiáng)推了Eager Execution動(dòng)態(tài)計(jì)算圖颊咬,而pytorch一開(kāi)始就是動(dòng)態(tài)設(shè)計(jì)的。感覺(jué)tf無(wú)論是做動(dòng)態(tài)計(jì)算還是整合keras作高級(jí)api牡辽,好像都是做修補(bǔ)工作喳篇,貌似tf的底層很混亂的樣子,但奈何谷歌財(cái)大氣粗态辛,大力推廣tf麸澜。保險(xiǎn)起見(jiàn),精力允許的條件下奏黑,最好學(xué)習(xí)Keras和PyTorch(Keras比PyTorch更容易學(xué)炊邦,二者選其一的話(huà),先學(xué)前者熟史,參考深度學(xué)習(xí)“四大名著”馁害,http://www.reibang.com/p/de5a5179ba28)。

目前研究人員正在使用的深度學(xué)習(xí)框架不盡相同蹂匹,有TensorFlow碘菜、Caffe、Theano限寞、Keras等忍啸,常見(jiàn)的深度學(xué)習(xí)框架如下圖所示。

  1. Theano

Theano最初誕生于蒙特利爾大學(xué) LISA 實(shí)驗(yàn)室履植,于2008年開(kāi)始開(kāi)發(fā)计雌,是第一個(gè)有較大影響力的Python深度學(xué)習(xí)框架。

Theano 是一個(gè) Python 庫(kù)玫霎,可用于定義凿滤、優(yōu)化和計(jì)算數(shù)學(xué)表達(dá)式,特別是多維數(shù)組(numpy.ndarray)庶近。在解決包含大量數(shù)據(jù)的問(wèn)題時(shí)翁脆,使用 Theano 編程可實(shí)現(xiàn)比手寫(xiě) C 語(yǔ)言更快的速度,而通過(guò) GPU 加速拦盹,Theano 甚至可以比基于 CPU 計(jì)算的 C 語(yǔ)言快上好幾個(gè)數(shù)量級(jí)鹃祖。Theano 結(jié)合了計(jì)算機(jī)代數(shù)系統(tǒng)(Computer Algebra System溪椎,CAS)和優(yōu)化編譯器普舆,還可以為多種數(shù)學(xué)運(yùn)算生成定制的 C 語(yǔ)言代碼恬口。對(duì)于包含重復(fù)計(jì)算的復(fù)雜數(shù)學(xué)表達(dá)式的任務(wù)而言,計(jì)算速度很重要沼侣,因此這種 CAS 和優(yōu)化編譯器的組合是很有用的祖能。對(duì)需要將每一種不同的數(shù)學(xué)表達(dá)式都計(jì)算一遍的情況,Theano 可以最小化編譯/解析的計(jì)算量蛾洛,但仍然會(huì)給出如自動(dòng)微分那樣的符號(hào)特征养铸。

Theano誕生于研究機(jī)構(gòu),服務(wù)于研究人員轧膘,其設(shè)計(jì)具有較濃厚的學(xué)術(shù)氣息钞螟,但在工程設(shè)計(jì)上有較大的缺陷。一直以來(lái)谎碍,Theano因難調(diào)試鳞滨、構(gòu)建圖慢等缺點(diǎn)為人所詬病。為了加速深度學(xué)習(xí)研究蟆淀,人們?cè)谒幕A(chǔ)之上拯啦,開(kāi)發(fā)了Lasagne、Blocks熔任、PyLearn2和Keras等第三方框架褒链,這些框架以Theano為基礎(chǔ),提供了更好的封裝接口以方便用戶(hù)使用疑苔。

2017年9月28日甫匹,在Theano 1.0正式版即將發(fā)布前夕,LISA實(shí)驗(yàn)室負(fù)責(zé)人夯巷,深度學(xué)習(xí)三巨頭之一的Yoshua Bengio 宣布Theano即將停止開(kāi)發(fā):“Theano is Dead”赛惩。盡管Theano即將退出歷史舞臺(tái),但作為第一個(gè)Python深度學(xué)習(xí)框架趁餐,它很好地完成了自己的使命喷兼,為深度學(xué)習(xí)研究人員的早期拓荒提供了極大的幫助,同時(shí)也為之后深度學(xué)習(xí)框架的開(kāi)發(fā)奠定了基本設(shè)計(jì)方向: 以計(jì)算圖為框架的核心后雷,采用GPU加速計(jì)算季惯。

2017年11月,LISA實(shí)驗(yàn)室在 GitHub 上開(kāi)啟了一個(gè)初學(xué)者入門(mén)項(xiàng)目臀突,旨在幫助實(shí)驗(yàn)室新生快速掌握機(jī)器學(xué)習(xí)相關(guān)的實(shí)踐基礎(chǔ)勉抓,而該項(xiàng)目正是使用PyTorch作為教學(xué)框架。

點(diǎn)評(píng):由于Theano已經(jīng)停止開(kāi)發(fā)候学,不建議作為研究工具繼續(xù)學(xué)習(xí)藕筋。

  1. TensorFlow

2015年11月10日,Google宣布推出全新的機(jī)器學(xué)習(xí)開(kāi)源工具TensorFlow梳码。 TensorFlow 最初是由 Google 機(jī)器智能研究部門(mén)的 Google Brain 團(tuán)隊(duì)開(kāi)發(fā)隐圾,基于Google 2011年開(kāi)發(fā)的深度學(xué)習(xí)基礎(chǔ)架構(gòu)DistBelief構(gòu)建起來(lái)的伍掀。TensorFlow主要用于進(jìn)行機(jī)器學(xué)習(xí)和深度神經(jīng)網(wǎng)絡(luò)研究, 但它是一個(gè)非诚静兀基礎(chǔ)的系統(tǒng)蜜笤,因此也可以應(yīng)用于眾多領(lǐng)域。由于Google在深度學(xué)習(xí)領(lǐng)域的巨大影響力和強(qiáng)大的推廣能力盐碱,TensorFlow一經(jīng)推出就獲得了極大的關(guān)注把兔,并迅速成為如今用戶(hù)最多的深度學(xué)習(xí)框架。

TensorFlow在很大程度上可以看作Theano的后繼者瓮顽,不僅因?yàn)樗鼈冇泻艽笠慌餐拈_(kāi)發(fā)者县好,而且它們還擁有相近的設(shè)計(jì)理念,都是基于計(jì)算圖實(shí)現(xiàn)自動(dòng)微分系統(tǒng)暖混。TensorFlow 使用數(shù)據(jù)流圖進(jìn)行數(shù)值計(jì)算聘惦,圖中的節(jié)點(diǎn)代表數(shù)學(xué)運(yùn)算, 而圖中的邊則代表在這些節(jié)點(diǎn)之間傳遞的多維數(shù)組(張量)儒恋。

TensorFlow編程接口支持Python和C++善绎。隨著1.0版本的公布,Java诫尽、Go禀酱、R和Haskell API的alpha版本也被支持。此外牧嫉,TensorFlow還可在Google Cloud和AWS中運(yùn)行剂跟。TensorFlow還支持 Windows 7、Windows 10和Windows Server 2016酣藻。由于TensorFlow使用C++ Eigen庫(kù)曹洽,所以庫(kù)可在ARM架構(gòu)上編譯和優(yōu)化。這也就意味著用戶(hù)可以在各種服務(wù)器和移動(dòng)設(shè)備上部署自己的訓(xùn)練模型辽剧,無(wú)須執(zhí)行單獨(dú)的模型解碼器或者加載Python解釋器送淆。

作為當(dāng)前最流行的深度學(xué)習(xí)框架,TensorFlow獲得了極大的成功怕轿,對(duì)它的批評(píng)也不絕于耳偷崩,總結(jié)起來(lái)主要有以下四點(diǎn)。

  • 過(guò)于復(fù)雜的系統(tǒng)設(shè)計(jì)撞羽,TensorFlow 在GitHub代碼倉(cāng)庫(kù)的總代碼量超過(guò)100萬(wàn)行阐斜。這么大的代碼倉(cāng)庫(kù),對(duì)于項(xiàng)目維護(hù)者來(lái)說(shuō)維護(hù)成為了一個(gè)難以完成的任務(wù)诀紊,而對(duì)讀者來(lái)說(shuō)谒出,學(xué)習(xí)TensorFlow底層運(yùn)行機(jī)制更是一個(gè)極其痛苦的過(guò)程,并且大多數(shù)時(shí)候這種嘗試以放棄告終。
  • 頻繁變動(dòng)的接口笤喳。TensorFlow的接口一直處于快速迭代之中考赛,并且沒(méi)有很好地考慮向后兼容性,這導(dǎo)致現(xiàn)在許多開(kāi)源代碼已經(jīng)無(wú)法在新版的TensorFlow上運(yùn)行莉测,同時(shí)也間接導(dǎo)致了許多基于TensorFlow的第三方框架出現(xiàn)BUG。
  • 接口設(shè)計(jì)過(guò)于晦澀難懂唧喉。在設(shè)計(jì)TensorFlow時(shí)捣卤,創(chuàng)造了圖、會(huì)話(huà)八孝、命名空間董朝、PlaceHolder等諸多抽象概念,對(duì)普通用戶(hù)來(lái)說(shuō)難以理解干跛。同一個(gè)功能子姜,TensorFlow提供了多種實(shí)現(xiàn),這些實(shí)現(xiàn)良莠不齊楼入,使用中還有細(xì)微的區(qū)別哥捕,很容易將用戶(hù)帶入坑中。
  • 文檔混亂脫節(jié)嘉熊。TensorFlow作為一個(gè)復(fù)雜的系統(tǒng)遥赚,文檔和教程眾多,但缺乏明顯的條理和層次阐肤,雖然查找很方便凫佛,但用戶(hù)卻很難找到一個(gè)真正循序漸進(jìn)的入門(mén)教程。
    由于直接使用TensorFlow的生產(chǎn)力過(guò)于低下孕惜,包括Google官方等眾多開(kāi)發(fā)者嘗試基于TensorFlow構(gòu)建一個(gè)更易用的接口愧薛,包括Keras、Sonnet衫画、TFLearn毫炉、TensorLayer、Slim削罩、Fold碘箍、PrettyLayer等數(shù)不勝數(shù)的第三方框架每隔幾個(gè)月就會(huì)在新聞中出現(xiàn)一次,但是又大多歸于沉寂鲸郊,至今TensorFlow仍沒(méi)有一個(gè)統(tǒng)一易用的接口丰榴。

憑借Google著強(qiáng)大的推廣能力,TensorFlow已經(jīng)成為當(dāng)今最炙手可熱的深度學(xué)習(xí)框架秆撮,但是由于自身的缺陷四濒,TensorFlow離最初的設(shè)計(jì)目標(biāo)還很遙遠(yuǎn)。另外,由于Google對(duì)TensorFlow略顯嚴(yán)格的把控盗蟆,目前各大公司都在開(kāi)發(fā)自己的深度學(xué)習(xí)框架戈二。

點(diǎn)評(píng):不完美但最流行的深度學(xué)習(xí)框架,社區(qū)強(qiáng)大喳资,適合生產(chǎn)環(huán)境觉吭。

  1. Keras

Keras是一個(gè)高層神經(jīng)網(wǎng)絡(luò)API,由純Python編寫(xiě)而成并使用TensorFlow仆邓、Theano及CNTK作為后端鲜滩。Keras為支持快速實(shí)驗(yàn)而生,能夠把想法迅速轉(zhuǎn)換為結(jié)果节值。Keras應(yīng)該是深度學(xué)習(xí)框架之中最容易上手的一個(gè)徙硅,它提供了一致而簡(jiǎn)潔的API, 能夠極大地減少一般應(yīng)用下用戶(hù)的工作量搞疗,避免用戶(hù)重復(fù)造輪子嗓蘑。

嚴(yán)格意義上講,Keras并不能稱(chēng)為一個(gè)深度學(xué)習(xí)框架匿乃,它更像一個(gè)深度學(xué)習(xí)接口桩皿,它構(gòu)建于第三方框架之上。Keras的缺點(diǎn)很明顯:過(guò)度封裝導(dǎo)致喪失靈活性幢炸。Keras最初作為T(mén)heano的高級(jí)API而誕生业簿,后來(lái)增加了TensorFlow和CNTK作為后端。為了屏蔽后端的差異性阳懂,提供一致的用戶(hù)接口梅尤,Keras做了層層封裝,導(dǎo)致用戶(hù)在新增操作或是獲取底層的數(shù)據(jù)信息時(shí)過(guò)于困難岩调。同時(shí)巷燥,過(guò)度封裝也使得Keras的程序過(guò)于緩慢,許多BUG都隱藏于封裝之中号枕,在絕大多數(shù)場(chǎng)景下缰揪,Keras是本文介紹的所有框架中最慢的一個(gè)。

學(xué)習(xí)Keras十分容易葱淳,但是很快就會(huì)遇到瓶頸钝腺,因?yàn)樗鄙凫`活性。另外赞厕,在使用Keras的大多數(shù)時(shí)間里艳狐,用戶(hù)主要是在調(diào)用接口,很難真正學(xué)習(xí)到深度學(xué)習(xí)的內(nèi)容皿桑。

點(diǎn)評(píng):入門(mén)最簡(jiǎn)單毫目,但是不夠靈活蔬啡,使用受限。

  1. Caffe/Caffe2

Caffe的全稱(chēng)是Convolutional Architecture for Fast Feature Embedding镀虐,它是一個(gè)清晰箱蟆、高效的深度學(xué)習(xí)框架,核心語(yǔ)言是C++刮便,它支持命令行空猜、Python和MATLAB接口,既可以在CPU上運(yùn)行恨旱,也可以在GPU上運(yùn)行辈毯。

Caffe的優(yōu)點(diǎn)是簡(jiǎn)潔快速,缺點(diǎn)是缺少靈活性窖杀。不同于Keras因?yàn)樘嗟姆庋b導(dǎo)致靈活性喪失,Caffe靈活性的缺失主要是因?yàn)樗脑O(shè)計(jì)裙士。在Caffe中最主要的抽象對(duì)象是層入客,每實(shí)現(xiàn)一個(gè)新的層,必須要利用C++實(shí)現(xiàn)它的前向傳播和反向傳播代碼腿椎,而如果想要新層運(yùn)行在GPU上桌硫,還需要同時(shí)利用CUDA實(shí)現(xiàn)這一層的前向傳播和反向傳播。這種限制使得不熟悉C++和CUDA的用戶(hù)擴(kuò)展Caffe十分困難啃炸。

Caffe憑借其易用性铆隘、簡(jiǎn)潔明了的源碼、出眾的性能和快速的原型設(shè)計(jì)獲取了眾多用戶(hù)南用,曾經(jīng)占據(jù)深度學(xué)習(xí)領(lǐng)域的半壁江山膀钠。但是在深度學(xué)習(xí)新時(shí)代到來(lái)之時(shí),Caffe已經(jīng)表現(xiàn)出明顯的力不從心裹虫,諸多問(wèn)題逐漸顯現(xiàn)(包括靈活性缺失肿嘲、擴(kuò)展難、依賴(lài)眾多環(huán)境難以配置筑公、應(yīng)用局限等)雳窟。盡管現(xiàn)在在GitHub上還能找到許多基于Caffe的項(xiàng)目,但是新的項(xiàng)目已經(jīng)越來(lái)越少匣屡。

Caffe的作者從加州大學(xué)伯克利分校畢業(yè)后加入了Google封救,參與過(guò)TensorFlow的開(kāi)發(fā),后來(lái)離開(kāi)Google加入FAIR捣作,擔(dān)任工程主管誉结,并開(kāi)發(fā)了Caffe2。Caffe2是一個(gè)兼具表現(xiàn)力券躁、速度和模塊性的開(kāi)源深度學(xué)習(xí)框架搓彻。它沿襲了大量的 Caffe 設(shè)計(jì)如绸,可解決多年來(lái)在 Caffe 的使用和部署中發(fā)現(xiàn)的瓶頸問(wèn)題。Caffe2的設(shè)計(jì)追求輕量級(jí)旭贬,在保有擴(kuò)展性和高性能的同時(shí)怔接,Caffe2 也強(qiáng)調(diào)了便攜性。Caffe2 從一開(kāi)始就以性能稀轨、擴(kuò)展扼脐、移動(dòng)端部署作為主要設(shè)計(jì)目標(biāo)。Caffe2 的核心 C++ 庫(kù)能提供速度和便攜性奋刽,而其 Python 和 C++ API 使用戶(hù)可以輕松地在 Linux瓦侮、Windows、iOS佣谐、Android 肚吏,甚至 Raspberry Pi 和 NVIDIA Tegra 上進(jìn)行原型設(shè)計(jì)、訓(xùn)練和部署狭魂。

Caffe2繼承了Caffe的優(yōu)點(diǎn)罚攀,在速度上令人印象深刻。Facebook 人工智能實(shí)驗(yàn)室與應(yīng)用機(jī)器學(xué)習(xí)團(tuán)隊(duì)合作雌澄,利用Caffe2大幅加速機(jī)器視覺(jué)任務(wù)的模型訓(xùn)練過(guò)程斋泄,僅需 1 小時(shí)就訓(xùn)練完ImageNet 這樣超大規(guī)模的數(shù)據(jù)集。然而盡管已經(jīng)發(fā)布半年多镐牺,開(kāi)發(fā)一年多炫掐,Caffe2仍然是一個(gè)不太成熟的框架,官網(wǎng)至今沒(méi)提供完整的文檔睬涧,安裝也比較麻煩募胃,編譯過(guò)程時(shí)常出現(xiàn)異常,在GitHub上也很少找到相應(yīng)的代碼畦浓。

極盛的時(shí)候摔认,Caffe占據(jù)了計(jì)算機(jī)視覺(jué)研究領(lǐng)域的半壁江山,雖然如今Caffe已經(jīng)很少用于學(xué)術(shù)界宅粥,但是仍有不少計(jì)算機(jī)視覺(jué)相關(guān)的論文使用Caffe参袱。由于其穩(wěn)定、出眾的性能秽梅,不少公司還在使用Caffe部署模型抹蚀。Caffe2盡管做了許多改進(jìn),但是還遠(yuǎn)沒(méi)有達(dá)到替代Caffe的地步企垦。

點(diǎn)評(píng):文檔不夠完善环壤,但性能優(yōu)異,幾乎全平臺(tái)支持(Caffe2)钞诡,適合生產(chǎn)環(huán)境郑现。

  1. MXNet

MXNet是一個(gè)深度學(xué)習(xí)庫(kù)湃崩,支持C++、Python接箫、R攒读、Scala、Julia辛友、MATLAB及JavaScript等語(yǔ)言薄扁;支持命令和符號(hào)編程;可以運(yùn)行在CPU废累、GPU邓梅、集群、服務(wù)器邑滨、臺(tái)式機(jī)或者移動(dòng)設(shè)備上日缨。MXNet是CXXNet的下一代,CXXNet借鑒了Caffe的思想掖看,但是在實(shí)現(xiàn)上更干凈匣距。在2014 年的NIPS 上,同為上海交大校友的陳天奇與李沐碰頭乙各,討論到各自在做深度學(xué)習(xí) Toolkits 的項(xiàng)目組墨礁,發(fā)現(xiàn)大家普遍在做很多重復(fù)性的工作幢竹,例如文件 loading 等耳峦。于是他們決定組建 DMLC【Distributied (Deep) Machine Learning Community】,號(hào)召大家一起合作開(kāi)發(fā) MXNet焕毫,發(fā)揮各自的特長(zhǎng)蹲坷,避免重復(fù)造輪子。

MXNet以其超強(qiáng)的分布式支持邑飒,明顯的內(nèi)存循签、顯存優(yōu)化為人所稱(chēng)道。同樣的模型疙咸,MXNet往往占用更小的內(nèi)存和顯存县匠,并且在分布式環(huán)境下,MXNet展現(xiàn)出了明顯優(yōu)于其他框架的擴(kuò)展性能撒轮。

由于MXNet最初由一群學(xué)生開(kāi)發(fā)乞旦,缺乏商業(yè)應(yīng)用,極大地限制了MXNet的使用题山。2016年11月兰粉,MXNet被AWS正式選擇為其云計(jì)算的官方深度學(xué)習(xí)平臺(tái)。2017年1月顶瞳,MXNet項(xiàng)目進(jìn)入Apache基金會(huì)玖姑,成為Apache的孵化器項(xiàng)目愕秫。

盡管MXNet擁有最多的接口,也獲得了不少人的支持焰络,但其始終處于一種不溫不火的狀態(tài)戴甩。個(gè)人認(rèn)為這在很大程度上歸結(jié)于推廣不給力及接口文檔不夠完善。MXNet長(zhǎng)期處于快速迭代的過(guò)程舔琅,其文檔卻長(zhǎng)時(shí)間未更新等恐,導(dǎo)致新手用戶(hù)難以掌握MXNet,老用戶(hù)常常需要查閱源碼才能真正理解MXNet接口的用法备蚓。

為了完善MXNet的生態(tài)圈课蔬,推廣MXNet,MXNet先后推出了包括MinPy郊尝、Keras和Gluon等諸多接口二跋,但前兩個(gè)接口目前基本停止了開(kāi)發(fā),Gluon模仿PyTorch的接口設(shè)計(jì)流昏,MXNet的作者李沐更是親自上陣扎即,在線(xiàn)講授如何從零開(kāi)始利用Gluon學(xué)習(xí)深度學(xué)習(xí),誠(chéng)意滿(mǎn)滿(mǎn)况凉,吸引了許多新用戶(hù)谚鄙。

點(diǎn)評(píng):文檔略混亂,但分布式性能強(qiáng)大刁绒,語(yǔ)言支持最多闷营,適合AWS云平臺(tái)使用。

  1. CNTK

2015年8月知市,微軟公司在CodePlex上宣布由微軟研究院開(kāi)發(fā)的計(jì)算網(wǎng)絡(luò)工具集CNTK將開(kāi)源傻盟。5個(gè)月后,2016年1月25日嫂丙,微軟公司在他們的GitHub倉(cāng)庫(kù)上正式開(kāi)源了CNTK娘赴。早在2014年,在微軟公司內(nèi)部跟啤,黃學(xué)東博士和他的團(tuán)隊(duì)正在對(duì)計(jì)算機(jī)能夠理解語(yǔ)音的能力進(jìn)行改進(jìn)诽表,但當(dāng)時(shí)使用的工具顯然拖慢了他們的進(jìn)度。于是隅肥,一組由志愿者組成的開(kāi)發(fā)團(tuán)隊(duì)構(gòu)想設(shè)計(jì)了他們自己的解決方案竿奏,最終誕生了CNTK。

根據(jù)微軟開(kāi)發(fā)者的描述武福,CNTK的性能比Caffe议双、Theano、TensoFlow等主流工具都要強(qiáng)捉片。CNTK支持CPU和GPU模式平痰,和TensorFlow/Theano一樣汞舱,它把神經(jīng)網(wǎng)絡(luò)描述成一個(gè)計(jì)算圖的結(jié)構(gòu),葉子節(jié)點(diǎn)代表輸入或者網(wǎng)絡(luò)參數(shù)宗雇,其他節(jié)點(diǎn)代表計(jì)算步驟昂芜。CNTK 是一個(gè)非常強(qiáng)大的命令行系統(tǒng),可以創(chuàng)建神經(jīng)網(wǎng)絡(luò)預(yù)測(cè)系統(tǒng)赔蒲。CNTK 最初是出于在 Microsoft 內(nèi)部使用的目的而開(kāi)發(fā)的泌神,一開(kāi)始甚至沒(méi)有Python接口,而是使用了一種幾乎沒(méi)什么人用的語(yǔ)言開(kāi)發(fā)的舞虱,而且文檔有些晦澀難懂欢际,推廣不是很給力,導(dǎo)致現(xiàn)在用戶(hù)比較少矾兜。但就框架本身的質(zhì)量而言损趋,CNTK表現(xiàn)得比較均衡,沒(méi)有明顯的短板椅寺,并且在語(yǔ)音領(lǐng)域效果比較突出浑槽。

點(diǎn)評(píng):社區(qū)不夠活躍,但是性能突出返帕,擅長(zhǎng)語(yǔ)音方面的相關(guān)研究桐玻。

  1. 其他框架

除了上述的幾個(gè)框架,還有不少的框架荆萤,都有一定的影響力和用戶(hù)镊靴。比如百度開(kāi)源的PaddlePaddle,CMU開(kāi)發(fā)的DyNet观腊,簡(jiǎn)潔無(wú)依賴(lài)符合C++11標(biāo)準(zhǔn)的tiny-dnn邑闲,使用Java開(kāi)發(fā)并且文檔極其優(yōu)秀的Deeplearning4J算行,還有英特爾開(kāi)源的Nervana梧油,Amazon開(kāi)源的DSSTNE。這些框架各有優(yōu)缺點(diǎn)州邢,但是大多流行度和關(guān)注度不夠儡陨,或者局限于一定的領(lǐng)域。此外量淌,還有許多專(zhuān)門(mén)針對(duì)移動(dòng)設(shè)備開(kāi)發(fā)的框架骗村,如CoreML、MDL呀枢,這些框架純粹為部署而誕生胚股,不具有通用性,也不適合作為研究工具裙秋。


為什么選擇PyTorch

這么多深度學(xué)習(xí)框架琅拌,為什么選擇PyTorch呢缨伊?

因?yàn)镻yTorch是當(dāng)前難得的簡(jiǎn)潔優(yōu)雅且高效快速的框架。在筆者眼里进宝,PyTorch達(dá)到目前深度學(xué)習(xí)框架的最高水平刻坊。當(dāng)前開(kāi)源的框架中,沒(méi)有哪一個(gè)框架能夠在靈活性党晋、易用性谭胚、速度這三個(gè)方面有兩個(gè)能同時(shí)超過(guò)PyTorch。下面是許多研究人員選擇PyTorch的原因未玻。

① 簡(jiǎn)潔:PyTorch的設(shè)計(jì)追求最少的封裝灾而,盡量避免重復(fù)造輪子。不像TensorFlow中充斥著session扳剿、graph绰疤、operation、name_scope舞终、variable轻庆、tensor、layer等全新的概念敛劝,PyTorch的設(shè)計(jì)遵循tensor→variable(autograd)→nn.Module 三個(gè)由低到高的抽象層次余爆,分別代表高維數(shù)組(張量)、自動(dòng)求導(dǎo)(變量)和神經(jīng)網(wǎng)絡(luò)(層/模塊)夸盟,而且這三個(gè)抽象之間聯(lián)系緊密蛾方,可以同時(shí)進(jìn)行修改和操作。

簡(jiǎn)潔的設(shè)計(jì)帶來(lái)的另外一個(gè)好處就是代碼易于理解上陕。PyTorch的源碼只有TensorFlow的十分之一左右桩砰,更少的抽象、更直觀(guān)的設(shè)計(jì)使得PyTorch的源碼十分易于閱讀释簿。在筆者眼里亚隅,PyTorch的源碼甚至比許多框架的文檔更容易理解。

② 速度:PyTorch的靈活性不以速度為代價(jià)庶溶,在許多評(píng)測(cè)中煮纵,PyTorch的速度表現(xiàn)勝過(guò)TensorFlow和Keras等框架 ∑荩框架的運(yùn)行速度和程序員的編碼水平有極大關(guān)系行疏,但同樣的算法,使用PyTorch實(shí)現(xiàn)的那個(gè)更有可能快過(guò)用其他框架實(shí)現(xiàn)的套像。

③易用:PyTorch是所有的框架中面向?qū)ο笤O(shè)計(jì)的最優(yōu)雅的一個(gè)酿联。PyTorch的面向?qū)ο蟮慕涌谠O(shè)計(jì)來(lái)源于Torch,而Torch的接口設(shè)計(jì)以靈活易用而著稱(chēng),Keras作者最初就是受Torch的啟發(fā)才開(kāi)發(fā)了Keras贞让。PyTorch繼承了Torch的衣缽采幌,尤其是API的設(shè)計(jì)和模塊的接口都與Torch高度一致。PyTorch的設(shè)計(jì)最符合人們的思維震桶,它讓用戶(hù)盡可能地專(zhuān)注于實(shí)現(xiàn)自己的想法休傍,即所思即所得,不需要考慮太多關(guān)于框架本身的束縛蹲姐。

④活躍的社區(qū):PyTorch提供了完整的文檔磨取,循序漸進(jìn)的指南,作者親自維護(hù)的論壇 供用戶(hù)交流和求教問(wèn)題柴墩。Facebook 人工智能研究院對(duì)PyTorch提供了強(qiáng)力支持忙厌,作為當(dāng)今排名前三的深度學(xué)習(xí)研究機(jī)構(gòu),F(xiàn)AIR的支持足以確保PyTorch獲得持續(xù)的開(kāi)發(fā)更新江咳,不至于像許多由個(gè)人開(kāi)發(fā)的框架那樣曇花一現(xiàn)逢净。

在PyTorch推出不到一年的時(shí)間內(nèi),各類(lèi)深度學(xué)習(xí)問(wèn)題都有利用PyTorch實(shí)現(xiàn)的解決方案在GitHub上開(kāi)源歼指。同時(shí)也有許多新發(fā)表的論文采用PyTorch作為論文實(shí)現(xiàn)的工具爹土,PyTorch正在受到越來(lái)越多人的追捧 。

如果說(shuō) TensorFlow的設(shè)計(jì)是“Make It Complicated”踩身,Keras的設(shè)計(jì)是“Make It Complicated And Hide It”胀茵,那么PyTorch的設(shè)計(jì)真正做到了“Keep it Simple,Stupid”挟阻。簡(jiǎn)潔即是美琼娘。

使用TensorFlow能找到很多別人的代碼,使用PyTorch能輕松實(shí)現(xiàn)自己的想法附鸽。


屬于動(dòng)態(tài)圖的未來(lái)

幾平所有的框架都是基于計(jì)算罔1的脱拼,而計(jì)算圖又可以分為靜態(tài)計(jì)算圖和動(dòng)態(tài)計(jì)算 閣,靜態(tài)計(jì)算圖先定義再運(yùn)行( defin巳 and run )坷备,一次定義多次運(yùn)行熄浓,而動(dòng)態(tài)計(jì)算罔是 在運(yùn)行過(guò)程中被定義的,在運(yùn)行的時(shí)候構(gòu)建( define by run )击你,可以多次構(gòu)建多次運(yùn)行玉组。 PyTorch 和 TensorFlow 都是基于計(jì)算閣的深度學(xué)習(xí)框架谎柄, PyTorch 使用的是動(dòng)態(tài)圖丁侄,而 TensorFlow 使用的是靜態(tài)閣 。 在 PyTorch 中每一次前向傳播(每一次運(yùn)行代碼)都會(huì)創(chuàng) 建一幅新的計(jì)算圖朝巫。

靜態(tài)鸿摇、圖一旦創(chuàng)建就不能修改, 而且靜態(tài)劈猿、圖定義的時(shí)候拙吉,使用了特殊的語(yǔ)法潮孽,就像新 學(xué)一門(mén)語(yǔ)言。 這還意味著你無(wú)法使用 if筷黔、 whil巳往史、 for-loop等常用的 Pythoni吾句。 因此靜 態(tài)圖框架不得不為這些操作專(zhuān) 門(mén)設(shè)計(jì)語(yǔ)法 佛舱,同時(shí)在構(gòu)建圖 的時(shí)候必須把所有可能 州現(xiàn) 的情況都包含進(jìn)去椎例,這也導(dǎo)致了靜態(tài)圖過(guò)于龐大, 可能占用過(guò)高的顯存请祖。 動(dòng)態(tài)圖框架就 沒(méi)有這個(gè)問(wèn)題订歪,它可以使用 Python的 if、 while肆捕、 for-loop等條件語(yǔ)句刷晋,最終創(chuàng)建的計(jì)算 圖取決于你執(zhí)行的條件分支 。

動(dòng)態(tài)計(jì)算圖的設(shè)計(jì)思想正被越來(lái)越多人所接受慎陵, 2017 年 1 月 20 日前后眼虱,先后有三款深度學(xué)習(xí)框架發(fā)布: PyTorch、 MinPy 和 DyNet席纽,這三個(gè)框架都是基于動(dòng)態(tài)圖 的設(shè) 計(jì)模式蒙幻。 PyTorch便是其中的佼佼者,至今已成為動(dòng)態(tài)圖框架的代表胆筒。 在 PyTorch之前邮破, Chainer就以動(dòng)態(tài)圖思想設(shè)計(jì)框架,并獲得用戶(hù)的一致好評(píng)仆救,然而 Chainer是由日本科 學(xué)家開(kāi)發(fā)的抒和,開(kāi)發(fā)人員和文檔都偏向于日本本土,沒(méi)有很好地做推廣 彤蔽。 PyTorch 的發(fā)布讓許多用戶(hù)第一次發(fā)現(xiàn)原來(lái)深度學(xué)習(xí)框架可以如此靈活摧莽、如此容易、 還如此快速顿痪。

動(dòng)態(tài)圖的思想直觀(guān)明了镊辕,更符合人的思考過(guò)程。 動(dòng)態(tài)蚁袭、圖的方式使得我們可以任意 修改前向傳播征懈,還可以隨時(shí)查看變量的值。 如果說(shuō)靜態(tài)|要|框架好比 C++揩悄, 每次運(yùn)行都要 編譯才行( session .run )卖哎, 那么動(dòng)態(tài)圖框架就是 Python,動(dòng)態(tài)執(zhí)行,可以交互式查看修 改亏娜。 動(dòng)態(tài)圖的這個(gè)特性使得我們可以在!Python 和 JupyterNotebook上隨時(shí)查看和修改 變量焕窝, 十分靈活。

動(dòng)態(tài)圖帶來(lái)的另外一個(gè)優(yōu)勢(shì)是調(diào)試更容易维贺,在 PyTorch 中它掂,代碼報(bào)錯(cuò)的地方,往往 就是你寫(xiě)錯(cuò)代碼的地方溯泣,而靜態(tài)圖需要先根據(jù)你的代碼生成 Graph對(duì)象群发,然后在 session. run()時(shí)報(bào)錯(cuò),這種報(bào)錯(cuò)幾乎很難找到對(duì)應(yīng)的代碼中真正錯(cuò)誤的地方 发乔。

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末熟妓,一起剝皮案震驚了整個(gè)濱河市,隨后出現(xiàn)的幾起案子栏尚,更是在濱河造成了極大的恐慌起愈,老刑警劉巖,帶你破解...
    沈念sama閱讀 206,378評(píng)論 6 481
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件译仗,死亡現(xiàn)場(chǎng)離奇詭異抬虽,居然都是意外死亡,警方通過(guò)查閱死者的電腦和手機(jī)纵菌,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,356評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門(mén)阐污,熙熙樓的掌柜王于貴愁眉苦臉地迎上來(lái),“玉大人咱圆,你說(shuō)我怎么就攤上這事笛辟。” “怎么了序苏?”我有些...
    開(kāi)封第一講書(shū)人閱讀 152,702評(píng)論 0 342
  • 文/不壞的土叔 我叫張陵手幢,是天一觀(guān)的道長(zhǎng)。 經(jīng)常有香客問(wèn)我忱详,道長(zhǎng)围来,這世上最難降的妖魔是什么? 我笑而不...
    開(kāi)封第一講書(shū)人閱讀 55,259評(píng)論 1 279
  • 正文 為了忘掉前任匈睁,我火速辦了婚禮监透,結(jié)果婚禮上,老公的妹妹穿的比我還像新娘航唆。我一直安慰自己胀蛮,他們只是感情好,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,263評(píng)論 5 371
  • 文/花漫 我一把揭開(kāi)白布佛点。 她就那樣靜靜地躺著醇滥,像睡著了一般黎比。 火紅的嫁衣襯著肌膚如雪超营。 梳的紋絲不亂的頭發(fā)上鸳玩,一...
    開(kāi)封第一講書(shū)人閱讀 49,036評(píng)論 1 285
  • 那天,我揣著相機(jī)與錄音演闭,去河邊找鬼不跟。 笑死,一個(gè)胖子當(dāng)著我的面吹牛米碰,可吹牛的內(nèi)容都是我干的窝革。 我是一名探鬼主播,決...
    沈念sama閱讀 38,349評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開(kāi)眼吕座,長(zhǎng)吁一口氣:“原來(lái)是場(chǎng)噩夢(mèng)啊……” “哼虐译!你這毒婦竟也來(lái)了?” 一聲冷哼從身側(cè)響起吴趴,我...
    開(kāi)封第一講書(shū)人閱讀 36,979評(píng)論 0 259
  • 序言:老撾萬(wàn)榮一對(duì)情侶失蹤漆诽,失蹤者是張志新(化名)和其女友劉穎,沒(méi)想到半個(gè)月后锣枝,有當(dāng)?shù)厝嗽跇?shù)林里發(fā)現(xiàn)了一具尸體厢拭,經(jīng)...
    沈念sama閱讀 43,469評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 35,938評(píng)論 2 323
  • 正文 我和宋清朗相戀三年撇叁,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了供鸠。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片。...
    茶點(diǎn)故事閱讀 38,059評(píng)論 1 333
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡陨闹,死狀恐怖楞捂,靈堂內(nèi)的尸體忽然破棺而出,到底是詐尸還是另有隱情趋厉,我是刑警寧澤泡一,帶...
    沈念sama閱讀 33,703評(píng)論 4 323
  • 正文 年R本政府宣布,位于F島的核電站觅廓,受9級(jí)特大地震影響鼻忠,放射性物質(zhì)發(fā)生泄漏。R本人自食惡果不足惜,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,257評(píng)論 3 307
  • 文/蒙蒙 一薇缅、第九天 我趴在偏房一處隱蔽的房頂上張望惭嚣。 院中可真熱鬧,春花似錦塑娇、人聲如沸。這莊子的主人今日做“春日...
    開(kāi)封第一講書(shū)人閱讀 30,262評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽(yáng)哨啃。三九已至,卻和暖如春写妥,著一層夾襖步出監(jiān)牢的瞬間拳球,已是汗流浹背。 一陣腳步聲響...
    開(kāi)封第一講書(shū)人閱讀 31,485評(píng)論 1 262
  • 我被黑心中介騙來(lái)泰國(guó)打工珍特, 沒(méi)想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留祝峻,地道東北人。 一個(gè)月前我還...
    沈念sama閱讀 45,501評(píng)論 2 354
  • 正文 我出身青樓扎筒,卻偏偏與公主長(zhǎng)得像莱找,于是被迫代替她去往敵國(guó)和親。 傳聞我的和親對(duì)象是個(gè)殘疾皇子嗜桌,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,792評(píng)論 2 345