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

本章內容程序員

一、TensorFlow算法

二、Keras編程

三、MXNet後端

四、CNTK數組

五、PyTorch服務器

 

常見的深度學習框架網絡

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

640?wx_fmt=png  

640?wx_fmt=png

 

一、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 七、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略顯嚴格的把控,目前各大公司都在開發本身的深度學習框架。

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

 

二、Keras

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

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

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

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

 

三、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雲平臺使用。

四、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表現得比較均衡,沒有明顯的短板,而且在語音領域效果比較突出。

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

 

五、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得到持續的開發更新,不至於像許多由我的開發的框架那樣曇花一現。

相關文章
相關標籤/搜索