【深度學習】常見的一些深度學習框架

前言

本篇博文旨在主要介紹一些常見的深度學習框架

一、背景介紹

目前常見的深度學習框架不盡相同,主要有TensorFlow、Caffe、Theano、Keras等,常見的深度學習框架如借圖如下所示。這些深度學習框架被應用於計算機視覺、語音識別、自然語言處理與生物信息學等領域,並獲取了極好的效果。本片博文就主要介紹一下當前深度學習領域影響力比較大的幾個框架,只作爲學習,還望小夥伴們對於不足之處多多包涵。
在這裏插入圖片描述

二、Theano

Theano最初誕生於蒙特利爾大學LIS實驗室,於2008年開始開發,是第一個有較大影響力的 Python深度學習框架。
        Theano是Python是一個庫,可用於定義、優化和計算數學表達式,特別是多維(numpy.ndaray)。在解決包含大量數據的問題時,使用Theano編程可實現比手寫C語言更快的速度,而通過GPU加速, Theano甚至可以比基於CPU計算的C語言快上好幾個數量級。 Theano結合了計算機代數系統(Computer Algebra System,cas)和優化編譯器,還可以爲多種數學運算生成定製的C語言代碼。對於包含重複計算的複雜數學表達式的任務而言,計算速度很重要,因此這種CAS和優化編譯器的組合是很有用的。對需要將每一種不同的數學表達式都計算一遍的情況, Theano可以最小化編譯解析的計算量,但仍然會給出如自動微分那樣的符號特徵。
        Theano誕生於研究機構,服務於研究人員,其設計具有較濃厚的學術氣息,但在工程設計上有較大的缺陷。一直以來, Theano因難調試、構建圖慢等缺點爲人所詬病。爲了加速深度學習研究,人們在它的基礎之上,開發了 Lasagne、 Blocks、 PyLearn22和Keras等第三方框架,這些框架以 Theano爲基礎,提供了更好的封裝接口以方便用戶使用。

三、TensorFlow

       1、2015年11月10日, Google宣佈推出全新的機器學習開源工具TensorFlowTensorFlow最初是由 Google機器智能研究部門的 Google Brain團隊開發,基於 Google2011年開發的深度學習基礎架構DistBelief構建起來的。 TensorFlow主要用於進行機器學習和深度神經網絡研究,但它是一個非常基礎的系統,因此也可以應用於衆多領域。
       2、TensorFlow在很大程度上可以看作Theano的後繼者,不僅因爲它們有很很多共同的開發者,而且它們還擁有相近的設計理念,都是基於計算圖實現自動微分系統。TensorFlow使用數據流圖進行數值計算,圖中的節點代表數學運算,而圖中的邊則表在這些節點之間傳遞的多維數組(張量)
       3、TensorFlow編程接口支持Python和C++。隨着1.0版本的公佈,java、Go、R和Haskell API的 alpha版本也被支持。此外, TensorFlow還可在 Google Cloud和AWS中運 行。 TensorFlow還支持 Windows7、 Windows10和 Windows Server2016.由於 TensorFlow使用C++ Eigen庫,所以庫可在ARM架構上編譯和優化。這也就意味着用戶可以在各種服務器和移動設備上部署自己的訓練模型,無須執行單獨的模型解碼器或者加載Python解釋器。
作爲當前最流行的深度學習框架, TensorFlow獲得了極大的成功,對它的批評也不絕於耳,總結起來主要有以下四點:

·1、過於複雜的系統設計, TensorFlow在 GitHub代碼倉庫的總代碼量超過100萬行。這麼大的代碼倉庫,對於項目維護者來說維護成爲了一個難以完成的任務,而對讀者來說,學習 TensorFlow底層運行機制更是一個極其痛苦的過程,並且大多數時候這種嘗試以放棄告終。
·2、頻繁變動的接口。 TensorFlow的接口一直處於快速迭代之中,並且沒有很好地考慮向後兼容性,這導致現在許多開源代碼已經無法在新版的 TensorFlow上運行,同時也間接導致了許多基於 TensorFlow的第三方框架出現BUG。
3、接口設計過於晦澀難懂。在設計 TensorFlow時,創造了圖、會話、命名空間、 Place-Holder等諸多抽象概念,對普通用戶來說難以理解。同一個功能, TensorFlow提供了多種實現,這些實現良莠不齊,使用中還有細微的區別,很容易將用戶帶入坑中。
4、·文檔混亂脫節。 TensorFlow作爲一個複雜的系統,文檔和教程衆多,但缺乏明顯的條理和層次,雖然查找很方便,但用戶卻很難找到一個真正循序漸進的入門教程。

由於直接使用 TensorFlow的生產力過於低下,包括 Google官方等衆多開發者嘗試基於 TensorFlow構建一個更易用的接口,包括Keras、 Sonnet、 TFLearn、 TensorLayerSlim、Fold、 PrettyLayer等數不勝數的第三方框架每隔幾個月就會在新聞中出現一次,但是又大多歸於沉寂,至今 TensorFlow仍沒有一個統一易用的接口。

四、Keras

       Keras是一個高層神經網絡API,由純Python編寫而成並使用TensorFlow、Theano及CNTK作爲後端。 Keras爲支持快速實驗而生,能夠把想法迅速轉換爲結果。Keras應該是深度學習框架之中最容易上手的一個,它提供了一致而簡潔的API,能夠極大地減少一般應用下用戶的工作量,避免用戶重複造輪子。
       嚴格意義上講, Keras並不能稱爲一個深度學習框架,它更像一個深度學習接口,它構建於第三方框架之上。 Keras的缺點很明顯:過度封裝導致喪失靈活性。 Keras最初作爲Theano的高級API而誕生,後來增加了TensorFlow和CTK作爲後端。爲了屏蔽後端的差異性,提供一致的用戶接口,Keras做了層層封裝,導致用戶在新增操作或是獲取底層的數據信息時過於困難。同時,過度封裝也使得 Keras的程序過於緩慢,許多BUG都隱藏於封裝之中,在絕大多數場景下, Keras大部分框架中最慢的一個。
       學習 Keras十分容易,但是很快就會遇到瓶頸,因爲它缺少靈活性。另外,在使用Keras的大多數時間裏,用戶主要是在調用接口,很難真正學習到深度學習的內容。總結下來:入門最簡單,但是不夠靈活,使用受限。

五、Caffe/Caffe2

       KerasCaffe的全稱是Convolutional Architecture for Fast Feature Embedding,它是一個清晰、高效的深度學習框架,核心語言是C++,它支持命令行、 Python和 MATLAB接口,既可以在CPU上運行,也可以在GPU上運行。
       Caffe的優點是:簡潔快速,缺點是缺少靈活性。不同於 Keras因爲太多的封裝導致靈活性喪失, Caffe靈活性的缺失主要是因爲它的設計。在 Caffe中最主要的抽象對象是層,每實現一個新的層,必須要利用C++實現它的前向傳播和反向傳播代碼,而如果想要新層運行在GPU上,還需要同時利用CUDA實現這一層的前向傳播和反向傳播。這種限制使得不熟悉C++和CUDA的用戶擴展 Caffe十分困難。
       Caffe憑藉其易用性、簡潔明瞭的源碼、出衆的性能和快速的原型設計獲取了衆多用戶,曾經佔據深度學習領域的半壁江山。但是在深度學習新時代到來之時, Caffe已經表現出明顯的力不從心,諸多問題逐漸顯現(包括靈活性缺失、擴展難、依賴衆多環境難以配置、應用侷限等)。儘管現在在 GitHub上還能找到許多基於 Caffe的項目,但是新的項目已經越來越少。
       Caffe的作者從加州大學伯克利分校畢業後加入了 Google,參與過 TensorFlow的開發,後來離開 Google加入FAIR,擔任工程主管,並開發了 Caffe2。Caffe2是一個兼具表現力、速度和模塊性的開源深度學習框架。它沿襲了大量的 Caffe設計,可解決多年來在 Caffe的使用和部署中發現的瓶頸問題。 Caffe2的設計追求輕量級,在保有擴展性和高性能的同時, Caffe2也強調了便攜性。 Caffe2從一開始就以性能、擴展、移動端部署作爲主要設計目標。 Caffe2的核心C++庫能提供速度和便攜性,而其 Python和C++API使用戶可以輕鬆地在Linux、 Windows、is、 Android,甚至 Raspberry Pi和NVIDIA Tegra上進行原型設計、訓練和部署。
       Caffe2繼承了 Caffe的優點,在速度上令人印象深刻。 Facebook人工智能實驗室與應用機器學習團隊合作,利用Caffe2大幅加速機器視覺任務的模型訓練過程,僅需1小時就訓練完 ImageNet這樣超大規模的數據集。然而儘管已經發布半年多,開發一年多, Caffe2仍然是一個不太成熟的框架,官網至今沒提供完整的文檔,安裝也比較麻煩,編譯過程時常出現異常,在 GitHub上也很少找到相應的代碼。
       極盛的時候,Caffe佔據了計算機視覺研究領域的半壁江山,雖然如今 Caffe已經很少用於學術界,但是仍有不少計算機視覺相關的論文使用Caffe由於其穩定、出衆的性能,不少公司還在使用 Caffe部署模型。Caffe2儘管做了許多改進,但是還遠沒有達到替代Caffe的地步,其次,文檔不夠完善,但性能優異,幾乎全平臺支持( Caffe2)適合生產環境。

六、MXNet

       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接口的用法。

七、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表現得比較均衡,沒有明顯的短板,並且在語音領域效果比較突出。此外:社區不夠活躍,但是性能突出,擅長語音方面的相關研究。

八、其他框架

        除了上述的幾個框架,還有不少的框架,都有一定的影響力和用戶。比如百度開源PaddlePaddle,CMU開發的 DyNet簡潔無依賴符合C++11標準的tiny-dnn,使用Java開發並且文檔極其優秀的Deeplearning44j,還有英特爾開源的 Nervana, Amazon開源的 DSSTNE。這些框架各有優缺點,但是大多流行度和關注度不夠,或者侷限於一定的領域,因此不做過多的介紹。此外,還有許多專門針對移動設備開發的框架,如CoreML、MDL,這些框架純粹爲部署而誕生,不具有通用性,也不適合作爲研究工具,同樣不做介紹。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章