主流的深度學習框架基本知識


本章內容

1、TensorFlow

2、Keras

3、MXNet

4、CNTK

5、PyTorch

 

常見的深度學習框架

常見的深度學習框架有 TensorFlow 、Caffe、Theano、Keras、PyTorch、MXNet等,如下圖所示。這些深度學習框架被應用於計算機視覺、語音識別、自然語言處理與生物信息學等領域,並獲取了極好的效果。下面將主要介紹當前深度學習領域影響力比較大的幾個框架, 

640?wx_fmt=png  

640?wx_fmt=png

 

1、TensorFlow-----擅長推斷特征提取

2015年11月10日,Google宣布推出全新的機器學習開源工具TensorFlow。 TensorFlow 最初是由 Google 機器智能研究部門的 Google Brain 團隊開發,基於Google 2011年開發的深度學習基礎架構DistBelief構建起來的。TensorFlow主要用於進行機器學習和深度神經網絡研究, 但它是一個非常基礎的系統,因此也可以應用於眾多領域。由於Google在深度學習領域的巨大影響力和強大的推廣能力,TensorFlow一經推出就獲得了極大的關注,並迅速成為如今用戶最多的深度學習框架。

TensorFlow在很大程度上可以看作Theano的后繼者,不僅因為它們有很大一批共同的開發者,而且它們還擁有相近的設計理念,都是基於計算圖實現自動微分系統。TensorFlow 使用數據流圖進行數值計算,圖中的節點代表數學運算, 而圖中的邊則代表在這些節點之間傳遞的多維數組(張量)。

TensorFlow編程接口支持Python和C++。隨着1.0版本的公布,Java、Go、R和Haskell API的alpha版本也被支持。此外,TensorFlow還可在Google Cloud和AWS中運行。TensorFlow還支持 Windows 7、Windows 10和Windows Server 2016。由於TensorFlow使用C++ Eigen庫,所以庫可在ARM架構上編譯和優化。這也就意味着用戶可以在各種服務器和移動設備上部署自己的訓練模型,無須執行單獨的模型解碼器或者加載Python解釋器。

作為當前最流行的深度學習框架,TensorFlow獲得了極大的成功,對它的批評也不絕於耳,總結起來主要有以下四點。 
• 過於復雜的系統設計,TensorFlow 在GitHub代碼倉庫的總代碼量超過100萬行。這么大的代碼倉庫,對於項目維護者來說維護成為了一個難以完成的任務,而對讀者來說,學習TensorFlow底層運行機制更是一個極其痛苦的過程,並且大多數時候這種嘗試以放棄告終。 
• 頻繁變動的接口。TensorFlow的接口一直處於快速迭代之中,並且沒有很好地考慮向后兼容性,這導致現在許多開源代碼已經無法在新版的TensorFlow上運行,同時也間接導致了許多基於TensorFlow的第三方框架出現BUG。 
• 接口設計過於晦澀難懂。在設計TensorFlow時,創造了圖、會話、命名空間、PlaceHolder等諸多抽象概念,對普通用戶來說難以理解。同一個功能,TensorFlow提供了多種實現,這些實現良莠不齊,使用中還有細微的區別,很容易將用戶帶入坑中。 
• 文檔混亂脫節。TensorFlow作為一個復雜的系統,文檔和教程眾多,但缺乏明顯的條理和層次,雖然查找很方便,但用戶卻很難找到一個真正循序漸進的入門教程。 
由於直接使用TensorFlow的生產力過於低下,包括Google官方等眾多開發者嘗試基於TensorFlow構建一個更易用的接口,包括Keras、Sonnet、TFLearn、TensorLayer、Slim、Fold、PrettyLayer等數不勝數的第三方框架每隔幾個月就會在新聞中出現一次,但是又大多歸於沉寂,至今TensorFlow仍沒有一個統一易用的接口。

憑借Google着強大的推廣能力,TensorFlow已經成為當今最炙手可熱的深度學習框架,但是由於自身的缺陷,TensorFlow離最初的設計目標還很遙遠。另外,由於Google對TensorFlow略顯嚴格的把控,目前各大公司都在開發自己的深度學習框架。

點評:不完美但最流行的深度學習框架,社區強大,適合生產環境。

 

2、Keras

Keras是一個高層神經網絡API,由純Python編寫而成並使用TensorFlow、Theano及CNTK作為后端。Keras為支持快速實驗而生,能夠把想法迅速轉換為結果。Keras應該是深度學習框架之中最容易上手的一個,它提供了一致而簡潔的API, 能夠極大地減少一般應用下用戶的工作量,避免用戶重復造輪子。

嚴格意義上講,Keras並不能稱為一個深度學習框架,它更像一個深度學習接口,它構建於第三方框架之上。Keras的缺點很明顯:過度封裝導致喪失靈活性。Keras最初作為Theano的高級API而誕生,后來增加了TensorFlow和CNTK作為后端。為了屏蔽后端的差異性,提供一致的用戶接口,Keras做了層層封裝,導致用戶在新增操作或是獲取底層的數據信息時過於困難。同時,過度封裝也使得Keras的程序過於緩慢,許多BUG都隱藏於封裝之中,在絕大多數場景下,Keras是本文介紹的所有框架中最慢的一個。

學習Keras十分容易,但是很快就會遇到瓶頸,因為它缺少靈活性。另外,在使用Keras的大多數時間里,用戶主要是在調用接口,很難真正學習到深度學習的內容。

點評:入門最簡單,但是不夠靈活,使用受限。

 

3、MXNet-----稱霸CNN、RNN和情感分析

MXNet是一個深度學習庫,支持C++、Python、R、Scala、Julia、MATLAB及JavaScript等語言;支持命令和符號編程;可以運行在CPU、GPU、集群、服務器、台式機或者移動設備上。MXNet是CXXNet的下一代,CXXNet借鑒了Caffe的思想,但是在實現上更干凈。在2014 年的NIPS 上,同為上海交大校友的陳天奇與李沐碰頭,討論到各自在做深度學習 Toolkits 的項目組,發現大家普遍在做很多重復性的工作,例如文件 loading 等。於是他們決定組建 DMLC【Distributied (Deep) Machine Learning Community】,號召大家一起合作開發 MXNet,發揮各自的特長,避免重復造輪子。

MXNet以其超強的分布式支持,明顯的內存、顯存優化為人所稱道。同樣的模型,MXNet往往占用更小的內存和顯存,並且在分布式環境下,MXNet展現出了明顯優於其他框架的擴展性能。

由於MXNet最初由一群學生開發,缺乏商業應用,極大地限制了MXNet的使用。2016年11月,MXNet被AWS正式選擇為其雲計算的官方深度學習平台。2017年1月,MXNet項目進入Apache基金會,成為Apache的孵化器項目。

盡管MXNet擁有最多的接口,也獲得了不少人的支持,但其始終處於一種不溫不火的狀態。個人認為這在很大程度上歸結於推廣不給力及接口文檔不夠完善。MXNet長期處於快速迭代的過程,其文檔卻長時間未更新,導致新手用戶難以掌握MXNet,老用戶常常需要查閱源碼才能真正理解MXNet接口的用法。

為了完善MXNet的生態圈,推廣MXNet,MXNet先后推出了包括MinPy、Keras和Gluon等諸多接口,但前兩個接口目前基本停止了開發,Gluon模仿PyTorch的接口設計,MXNet的作者李沐更是親自上陣,在線講授如何從零開始利用Gluon學習深度學習,誠意滿滿,吸引了許多新用戶。

點評:文檔略混亂,但分布式性能強大,語言支持最多,適合AWS雲平台使用。

4、CNTK

2015年8月,微軟公司在CodePlex上宣布由微軟研究院開發的計算網絡工具集CNTK將開源。5個月后,2016年1月25日,微軟公司在他們的GitHub倉庫上正式開源了CNTK。早在2014年,在微軟公司內部,黃學東博士和他的團隊正在對計算機能夠理解語音的能力進行改進,但當時使用的工具顯然拖慢了他們的進度。於是,一組由志願者組成的開發團隊構想設計了他們自己的解決方案,最終誕生了CNTK。

根據微軟開發者的描述,CNTK的性能比Caffe、Theano、TensoFlow等主流工具都要強。CNTK支持CPU和GPU模式,和TensorFlow/Theano一樣,它把神經網絡描述成一個計算圖的結構,葉子節點代表輸入或者網絡參數,其他節點代表計算步驟。CNTK 是一個非常強大的命令行系統,可以創建神經網絡預測系統。CNTK 最初是出於在 Microsoft 內部使用的目的而開發的,一開始甚至沒有Python接口,而是使用了一種幾乎沒什么人用的語言開發的,而且文檔有些晦澀難懂,推廣不是很給力,導致現在用戶比較少。但就框架本身的質量而言,CNTK表現得比較均衡,沒有明顯的短板,並且在語音領域效果比較突出。

點評:社區不夠活躍,但是性能突出,擅長語音方面的相關研究。

 

5、PyTorch

2017年1月,Facebook人工智能研究院(FAIR)團隊在GitHub上開源了PyTorch,並迅速占領GitHub熱度榜榜首。

PyTorch的歷史可追溯到2002年就誕生於紐約大學的Torch。Torch使用了一種不是很大眾的語言Lua作為接口。Lua簡潔高效,但由於其過於小眾,用的人不是很多。在2017年,Torch的幕后團隊推出了PyTorch。PyTorch不是簡單地封裝Lua Torch提供Python接口,而是對Tensor之上的所有模塊進行了重構,並新增了最先進的自動求導系統,成為當下最流行的動態圖框架。

• 簡潔:PyTorch的設計追求最少的封裝,盡量避免重復造輪子。不像TensorFlow中充斥着session、graph、operation、name_scope、variable、tensor、layer等全新的概念,PyTorch的設計遵循tensor→variable(autograd)→nn.Module 三個由低到高的抽象層次,分別代表高維數組(張量)、自動求導(變量)和神經網絡(層/模塊),而且這三個抽象之間聯系緊密,可以同時進行修改和操作。 
簡潔的設計帶來的另外一個好處就是代碼易於理解。PyTorch的源碼只有TensorFlow的十分之一左右,更少的抽象、更直觀的設計使得PyTorch的源碼十分易於閱讀。在筆者眼里,PyTorch的源碼甚至比許多框架的文檔更容易理解。

• 速度:PyTorch的靈活性不以速度為代價,在許多評測中,PyTorch的速度表現勝過TensorFlow和Keras等框架 。框架的運行速度和程序員的編碼水平有極大關系,但同樣的算法,使用PyTorch實現的那個更有可能快過用其他框架實現的。

• 易用:PyTorch是所有的框架中面向對象設計的最優雅的一個。PyTorch的面向對象的接口設計來源於Torch,而Torch的接口設計以靈活易用而著稱,Keras作者最初就是受Torch的啟發才開發了Keras。PyTorch繼承了Torch的衣缽,尤其是API的設計和模塊的接口都與Torch高度一致。PyTorch的設計最符合人們的思維,它讓用戶盡可能地專注於實現自己的想法,即所思即所得,不需要考慮太多關於框架本身的束縛。

• 活躍的社區:PyTorch提供了完整的文檔,循序漸進的指南,作者親自維護的論壇 供用戶交流和求教問題。Facebook 人工智能研究院對PyTorch提供了強力支持,作為當今排名前三的深度學習研究機構,FAIR的支持足以確保PyTorch獲得持續的開發更新,不至於像許多由個人開發的框架那樣曇花一現。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM