深度學習的經常使用框架

目 錄前端

1、Caffe (源於Berkeley的主流CV工具包)node

2、TensorFlow (Google的深度學習框架)python

3、Torch (Facebook用的卷積神經網絡工具包)git

4、Theano 程序員

5、Keras github

6、MXNet算法

7、其餘深度學習框架編程

8、其餘知識拓展認識後端

前言:深度學習框架是幫助使用者進行深度學習的工具,它的出現下降了深度學習入門的門檻,你不須要從複雜的神經網絡開始編代碼,就能夠根據須要使用現有的模型。各類開源深度學習框架也層出不窮,其中包括Caffe、TensorFlow、Keras、Torch七、MXNet、CNTK、Leaf、Theano、DeepLearning四、Lasagne、Neon等等。不一樣框架之間的「好與壞」,沒有一個統一的標準。數組

本人僅是深度學習的探索者,綜合網上前輩的資源,先給出一個表「各個開源框架在GitHub上的數據統計」,而後對其中的幾個分別進行以下總結:

1、Caffe (源於Berkeley的主流CV工具包)

1.1 Caffe簡述。

  全稱爲Convolutional Architecture for Fast Feature Embedding,是一個被普遍使用的開源深度學習框架(在TensorFlow出現以前一直是深度學習領域GitHub star最多的項目),目前由伯克利視覺學中心(Berkeley Vision and Learning Center,BVLC)進行維護。Caffe的創始人是加州大學伯克利的Ph.D.賈揚清,他同時也是TensorFlow的做者之一,曾工做於MSRA、NEC和Google Brain,目前就任於Facebook FAIR實驗室。

  Caffe基於C++和英偉達(NVIDIA)公司的GPU(Graphic Processing Unit)通用計算架構CUDA(Compute Unified Device Architecture)開發,特色是高效、可配置化的輸入、GPU和CPU的無縫切換。固然還有很是重要的一點,Caffe擁有龐大的社區,不管是科研領域仍是業界都有大量的用戶。每當一些最前沿的深度學習方法發表後,沒多久就會有官方的預訓練模型或是第三方基於Caffe的實現,因此Caffe是一個對初學者和有經驗的人都很是適合的工具。

  值得注意的是:Caffe是目前最成熟的框架,雖然有被TensorFlow趕超之勢,可是對於初學者而言最容易找到的資料仍是Caffe,並且Caffe上手難度略低於TensorFlow。MXNet的上手難度低,很是適合初學者。一直以來遭到詬病的文檔「爛」問題隨着Amazon的支持應該會慢慢改善,潛力很好。

 

1.2 Caffe介紹。

  首先,官方網址:caffe.berkeleyvision.org/ 及其GitHub:github.com/BVLC/caffe

  其次,歸納一下Caffe主要特色:源於Berkeley的主流CV工具包,支持C++,python,matlab,Model Zoo中有大量預訓練好的模型供使用。容易上手,網絡結構都是以配置文件形式定義,不須要用代碼設計網絡。訓練速度快,可以訓練state-of-the-art的模型與大規模的數據。組件模塊化,能夠方便地拓展到新的模型和學習任務上。在計算機視覺領域Caffe應用尤爲多,能夠用來作人臉識別、圖片分類、位置檢測、目標追蹤等。擁有大量的訓練好的經典模型(AlexNet、VGG、Inception)乃至其餘state-of-the-art(ResNet等)的模型,都收藏在Model Zoo(一個能夠下載Caffe模型以及網絡權重的網站)中,還能夠幫助你快速地準備樣本。可是,須要注意的是,在Caffe框架中,要調整超參數比其餘框架更爲繁瑣,部分緣由是須要爲每組超參數單獨定義不一樣的求解器和模型文件。Caffe 有很是好的特性,但也有一些小缺點。經實驗測試記錄,CaffeNet 架構的訓練時間在 Caffe 中比在 Keras 中(使用了 Theano 後端)少 5 倍。Caffe 的缺點是它不夠靈活。若是你想給它來一點新改變,那你就須要使用 C++ 和 CUDA 編程,不過你也能夠使用 Python 或 Matlab 接口進行一些小改變。 Caffe 的文檔很是貧乏。你須要花大量時間檢查代碼才能理解它(Xavier 初始化有什麼用?Glorot 是什麼?) 。Caffe 的最大缺點之一是它的安裝須要解決大量的依賴包……。固然,在投入了生產的計算機視覺系統的工具上,Caffe 是無可爭議的領導者,它很是穩健很是快速。有做者建議是:用 Keras 進行實驗和測試,而後遷移到 Caffe 中進行生產。

  繼續瞭解Caffe。 Caffe的核心概念是Layer,每個神經網絡的模塊都是一個Layer。Layer接收輸入數據,同時通過內部計算產生輸出數據。設計網絡結構時,只須要把各個Layer拼接在一塊兒構成完整的網絡(經過寫protobuf配置文件定義)。好比卷積的Layer,它的輸入就是圖片的所有像素點,內部進行的操做是各類像素值與Layer參數的convolution操做,最後輸出的是全部卷積核filter的結果。每個Layer須要定義兩種運算,一種是正向(forward)的運算,即從輸入數據計算輸出結果,也就是模型的預測過程;另外一種是反向(backward)的運算,從輸出端的gradient求解相對於輸入的gradient,即反向傳播算法,這部分也就是模型的訓練過程。實現新Layer時,須要將正向和反向兩種計算過程的函數都實現,這部分計算須要用戶本身寫C++或者CUDA(當須要運行在GPU時)代碼,對普通用戶來講仍是很是難上手的。正如它的名字Convolutional Architecture for Fast Feature Embedding所描述的,Caffe最開始設計時的目標只針對於圖像,沒有考慮文本、語音或者時間序列的數據,所以Caffe對卷積神經網絡的支持很是好,但對時間序列RNN、LSTM等支持得不是特別充分。同時,基於Layer的模式也對RNN不是很是友好,定義RNN結構時比較麻煩。在模型結構很是複雜時,可能須要寫很是冗長的配置文件才能設計好網絡,並且閱讀時也比較費力。

  Caffe的一大優點是擁有大量的訓練好的經典模型(AlexNet、VGG、Inception)乃至其餘state-of-the-art(ResNet等)的模型,收藏在它的Model Zoo(github.com/BVLC/ caffe/wiki/Model-Zoo)。由於知名度較高,Caffe被普遍地應用於前沿的工業界和學術界,許多提供源碼的深度學習的論文都是使用Caffe來實現其模型的。在計算機視覺領域Caffe應用尤爲多,能夠用來作人臉識別、圖片分類、位置檢測、目標追蹤等。雖然Caffe主要是面向學術圈和研究者的,但它的程序運行很是穩定,代碼質量比較高,因此也很適合對穩定性要求嚴格的生產環境,能夠算是第一個主流的工業級深度學習框架。由於Caffe的底層是基於C++的,所以能夠在各類硬件環境編譯並具備良好的移植性,支持Linux、Mac和Windows系統,也能夠編譯部署到移動設備系統如Android和iOS上。和其餘主流深度學習庫相似,Caffe也提供了Python語言接口pycaffe,在接觸新任務,設計新網絡時能夠使用其Python接口簡化操做。不過,一般用戶仍是使用Protobuf配置文件定義神經網絡結構,再使用command line進行訓練或者預測。Caffe的配置文件是一個JSON類型的.prototxt文件,其中使用許多順序鏈接的Layer來描述神經網絡結構。Caffe的二進制可執行程序會提取這些.prototxt文件並按其定義來訓練神經網絡。理論上,Caffe的用戶能夠徹底不寫代碼,只是定義網絡結構就能夠完成模型訓練了。Caffe完成訓練以後,用戶能夠把模型文件打包製做成簡單易用的接口,好比能夠封裝成Python或MATLAB的API。不過在.prototxt文件內部設計網絡節構可能會比較受限,沒有像TensorFlow或者Keras那樣在Python中設計網絡結構方便、自由。更重要的是,Caffe的配置文件不能用編程的方式調整超參數,也沒有提供像Scikit-learn那樣好用的estimator能夠方便地進行交叉驗證、超參數的Grid Search等操做Caffe在GPU上訓練的性能很好(使用單塊GTX 1080訓練AlexNet時一天能夠訓練上百萬張圖片),可是目前僅支持單機多GPU的訓練,沒有原生支持分佈式的訓練。慶幸的是,如今有不少第三方的支持,好比雅虎開源的CaffeOnSpark,能夠藉助Spark的分佈式框架實現Caffe的大規模分佈式訓練。

 

2、TensorFlow (Google的深度學習框架)

2.1 TensorFlow簡述。

  一個由谷歌開發的的深度學習框架,TensorBoard可視化很方便,數據和模型並行化好、速度快,提供了調整網絡和監控性能的工具,就像Tensorboard同樣,它還有一個可用做網絡應用程序的教育工具。TensorFlow 支持 Python 和 C++,也容許在 CPU 和 GPU 上的計算分佈,甚至支持使用 gRPC 進行水平擴展。隨着TensorFlow的持續改進以及Google光環的照耀,如今TensorFlow正在變得愈來愈流行。截至2016年5月,在github上關於TensorFlow的相關討論的數量已經超過Caffe躍居第一位。

 

2.2 TensorFlow介紹。

  在 TensorFlow 的官網上,它被定義爲「一個用於機器智能的開源軟件庫」,但有做者認爲說「TensorFlow 是一個使用數據流圖(data flow graphs)進行數值計算的開源軟件庫。在這裏,他們沒有將 TensorFlow 包含在「深度學習框架」範圍內,而是和 Theano 一塊兒被包含在「圖編譯器(graph compilers)」類別中。 在結束了 Udacity 的 Deep Learning 課程(https://www.udacity.com/course/deep-learning–ud730)以後,個人感受是 TensorFlow 是一個很是好的框架,可是卻很是低層。使用 TensorFlow 須要編寫大量的代碼,你必須一遍又一遍地從新發明輪子。」

  TensorFlow是一個相對高階的機器學習庫,用戶能夠方便地用它設計神經網絡結構,而沒必要爲了追求高效率的實現親自寫C++或CUDA代碼。它和Theano同樣都支持自動求導,用戶不須要再經過反向傳播求解梯度。其核心代碼和Caffe同樣是用C++編寫的,使用C++簡化了線上部署的複雜度,並讓手機這種內存和CPU資源都緊張的設備能夠運行復雜模型(Python則會比較消耗資源,而且執行效率不高)。除了核心代碼的C++接口,TensorFlow還有官方的Python、Go和Java接口,是經過SWIG(Simplified Wrapper and Interface Generator)實現的,這樣用戶就能夠在一個硬件配置較好的機器中用Python進行實驗,並在資源比較緊張的嵌入式環境或須要低延遲的環境中用C++部署模型。SWIG支持給C/C++代碼提供各類語言的接口,所以其餘腳本語言的接口將來也能夠經過SWIG方便地添加。不過使用Python時有一個影響效率的問題是,每個mini-batch要從Python中feed到網絡中,這個過程在mini-batch的數據量很小或者運算時間很短時,可能會帶來影響比較大的延遲。如今TensorFlow還有非官方的Julia、Node.js、R的接口支持,地址以下:

Julia在 github.com/malmaud/TensorFlow.jl ;

Node.js在github.com/node-tensorflow/node-tensorflow ;

R在 github.com/rstudio/tensorflow

  TensorFlow也有內置的TF.Learn和TF.Slim等上層組件能夠幫助快速地設計新網絡,而且兼容Scikit-learn estimator接口,能夠方便地實現evaluate、grid search、cross validation等功能。同時TensorFlow不僅侷限於神經網絡,其數據流式圖支持很是自由的算法表達,固然也能夠輕鬆實現深度學習之外的機器學習算法。事實上,只要能夠將計算表示成計算圖的形式,就能夠使用TensorFlow。用戶能夠寫內層循環代碼控制計算圖分支的計算,TensorFlow會自動將相關的分支轉爲子圖並執行迭代運算。TensorFlow也能夠將計算圖中的各個節點分配到不一樣的設備執行,充分利用硬件資源。定義新的節點只須要寫一個Python函數,若是沒有對應的底層運算核,那麼可能須要寫C++或者CUDA代碼實現運算操做。

  在數據並行模式上,TensorFlow和Parameter Server很像,但TensorFlow有獨立的Variable node,不像其餘框架有一個全局統一的參數服務器,所以參數同步更自由。TensorFlow和Spark的核心都是一個數據計算的流式圖,Spark面向的是大規模的數據,支持SQL等操做,而TensorFlow主要面向內存足以裝載模型參數的環境,這樣能夠最大化計算效率。

  TensorFlow的另一個重要特色是它靈活的移植性,能夠將同一份代碼幾乎不通過修改就輕鬆地部署到有任意數量CPU或GPU的PC、服務器或者移動設備上。相比於Theano,TensorFlow還有一個優點就是它極快的編譯速度,在定義新網絡結構時,Theano一般須要長時間的編譯,所以嘗試新模型須要比較大的代價,而TensorFlow徹底沒有這個問題。TensorFlow還有功能強大的可視化組件TensorBoard,能可視化網絡結構和訓練過程,對於觀察複雜的網絡結構和監控長時間、大規模的訓練頗有幫助。TensorFlow針對生產環境高度優化,它產品級的高質量代碼和設計均可以保證在生產環境中穩定運行,同時一旦TensorFlow普遍地被工業界使用,將產生良性循環,成爲深度學習領域的事實標準。

  除了支持常見的網絡結構(卷積神經網絡(Convolutional Neural Network,CNN)、循環神經網絡(Recurent Neural Network,RNN))外,TensorFlow還支持深度強化學習乃至其餘計算密集的科學計算(如偏微分方程求解等)。TensorFlow此前不支持symbolic loop,須要使用Python循環而沒法進行圖編譯優化,但最近新加入的XLA已經開始支持JIT和AOT,另外它使用bucketing trick也能夠比較高效地實現循環神經網絡。TensorFlow的一個薄弱地方可能在於計算圖必須構建爲靜態圖,這讓不少計算變得難以實現,尤爲是序列預測中常用的beam search。

  TensorFlow的用戶可以將訓練好的模型方便地部署到多種硬件、操做系統平臺上,支持Intel和AMD的CPU,經過CUDA支持NVIDIA的GPU(最近也開始經過OpenCL支持AMD的GPU,但沒有CUDA成熟),支持Linux和Mac,最近在0.12版本中也開始嘗試支持Windows。在工業生產環境中,硬件設備有些是最新款的,有些是用了幾年的老機型,來源可能比較複雜,TensorFlow的異構性讓它可以全面地支持各類硬件和操做系統。同時,其在CPU上的矩陣運算庫使用了Eigen而不是BLAS庫,可以基於ARM架構編譯和優化,所以在移動設備(Android和iOS)上表現得很好。

  TensorFlow在最開始發佈時只支持單機,並且只支持CUDA 6.5和cuDNN v2,而且沒有官方和其餘深度學習框架的對比結果。在2015年年末,許多其餘框架作了各類性能對比評測,每次TensorFlow都會做爲較差的對照組出現。那個時期的TensorFlow真的不快,性能上僅和廣泛認爲很慢的Theano比肩,在各個框架中能夠算是墊底。可是憑藉Google強大的開發實力,很快支持了新版的cuDNN(目前支持cuDNN v5.1),在單GPU上的性能追上了其餘框架。

   目前在單GPU的條件下,絕大多數深度學習框架都依賴於cuDNN,所以只要硬件計算能力或者內存分配差別不大,最終訓練速度不會相差太大。可是對於大規模深度學習來講,巨大的數據量使得單機很難在有限的時間完成訓練。這時須要分佈式計算使GPU集羣乃至TPU集羣並行計算,共同訓練出一個模型,因此框架的分佈式性能是相當重要的。TensorFlow在2016年4月開源了分佈式版本,使用16塊GPU可達單GPU的15倍提速,在50塊GPU時可達到40倍提速,分佈式的效率很高。目前原生支持的分佈式深度學習框架很少,只有TensorFlow、CNTK、DeepLearning4J、MXNet等。不過目前TensorFlow的設計對不一樣設備間的通訊優化得不是很好,其單機的reduction只能用CPU處理,分佈式的通訊使用基於socket的RPC,而不是速度更快的RDMA,因此其分佈式性能可能尚未達到最優。

  Google 在2016年2月開源了TensorFlow Serving,這個組件能夠將TensorFlow訓練好的模型導出,並部署成能夠對外提供預測服務的RESTful接口。有了這個組件,TensorFlow就能夠實現應用機器學習的全流程:從訓練模型、調試參數,到打包模型,最後部署服務,名副實際上是一個從研究到生產整條流水線都齊備的框架。這裏引用TensorFlow內部開發人員的描述:「TensorFlow Serving是一個爲生產環境而設計的高性能的機器學習服務系統。它能夠同時運行多個大規模深度學習模型,支持模型生命週期管理、算法實驗,並能夠高效地利用GPU資源,讓TensorFlow訓練好的模型更快捷方便地投入到實際生產環境」。除了TensorFlow之外的其餘框架都缺乏爲生產環境部署的考慮,而Google做爲普遍在實際產品中應用深度學習的巨頭可能也意識到了這個機會,所以開發了這個部署服務的平臺。TensorFlow Serving能夠說是一副王牌,將會幫TensorFlow成爲行業標準作出巨大貢獻。

  TensorBoard是TensorFlow的一組Web應用,用來監控TensorFlow運行過程,或可視化Computation Graph。TensorBoard目前支持5種可視化:標量(scalars)、圖片(images)、音頻(audio)、直方圖(histograms)和計算圖(Computation Graph)。TensorBoard的Events Dashboard能夠用來持續地監控運行時的關鍵指標,好比loss、學習速率(learning rate)或是驗證集上的準確率(accuracy);Image Dashboard則能夠展現訓練過程當中用戶設定保存的圖片,好比某個訓練中間結果用Matplotlib等繪製(plot)出來的圖片;Graph Explorer則能夠徹底展現一個TensorFlow的計算圖,而且支持縮放拖曳和查看節點屬性。

  TensorFlow擁有產品級的高質量代碼,有Google強大的開發、維護能力的加持,總體架構設計也很是優秀。相比於一樣基於Python的老牌對手Theano,TensorFlow更成熟、更完善,同時Theano的不少主要開發者都去了Google開發TensorFlow(例如書籍Deep Learning的做者Ian Goodfellow,他後來去了OpenAI)。Google做爲巨頭公司有比高校或者我的開發者多得多的資源投入到TensorFlow的研發,能夠預見,TensorFlow將來的發展將會是飛速的,可能會把大學或者我的維護的深度學習框架遠遠甩在身後。

 

3、Torch (Facebook用的卷積神經網絡工具包)

3.1 Torch簡述。

 Torch 是Facebook用的卷積神經網絡框架,其編程語言是 Lua,經過時域卷積的本地接口,使用很是直觀,定義新網絡層簡單。因巨頭 Facebook 的人工智能研究所用的框架是 Torch,而且在被谷歌收購以前 DeepMind 也是用的 Torch(收購以後 DeepMind 轉向了 TensorFlow)。在目前深度學習編程語言絕大部分以 Python 實現爲主的大趨勢下,一個以 Lua 爲編程語言的框架的最大劣勢莫過於此。毫無疑問,若是想使用 Torch 這個工具,須要先學習 Lua 語言而後才能使用 Torch,這當然是一個合理的過程。我的更偏向於用 Python、Matlab 或者 C++的實現。

 Torch支持大量的機器學習算法,同時以GPU上的計算優先。

3.2 Torch介紹。

  首先,官方網址:http://torch.ch/ 以及GitHub:github.com/torch/torch7

  Torch的目標是讓設計科學計算算法變得便捷,它包含了大量的機器學習、計算機視覺、信號處理、並行運算、圖像、視頻、音頻、網絡處理的庫,同時和Caffe相似,Torch擁有大量的訓練好的深度學習模型。它能夠支持設計很是複雜的神經網絡的拓撲圖結構,再並行化到CPU和GPU上,在Torch上設計新的Layer是相對簡單的。它和TensorFlow同樣使用了底層C++加上層腳本語言調用的方式,只不過Torch使用的是Lua。Lua的性能是很是優秀的(該語言常常被用來開發遊戲),常見的代碼能夠經過透明的JIT優化達到C的性能的80%;在便利性上,Lua的語法也很是簡單易讀,擁有漂亮和統一的結構,易於掌握,比寫C/C++簡潔不少;同時,Lua擁有一個很是直接的調用C程序的接口,能夠簡便地使用大量基於C的庫,由於底層核心是C寫的,所以也能夠方便地移植到各類環境。Lua支持Linux、Mac,還支持各類嵌入式系統(iOS、Android、FPGA等),只不過運行時仍是必須有LuaJIT的環境,因此工業生產環境的使用相對較少,沒有Caffe和TensorFlow那麼多。爲何不簡單地使用Python而是使用LuaJIT呢?官方給出瞭如下幾點理由:LuaJIT的通用計算性能遠勝於Python,並且能夠直接在LuaJIT中操做C的pointers;Torch的框架,包含Lua是自洽的,而徹底基於Python的程序對不一樣平臺、系統移植性較差,依賴的外部庫較多;LuaJIT的FFI拓展接口很是易學,能夠方便地連接其餘庫到Torch中。

  Torch中還專門設計了N-Dimension array type的對象Tensor,Torch中的Tensor是一塊內存的視圖,同時一塊內存可能有許多視圖(Tensor)指向它,這樣的設計同時兼顧了性能(直接面向內存)和便利性。同時,Torch還提供了很多相關的庫,包括線性代數、卷積、傅里葉變換、Torch的nn庫支持神經網絡、自編碼器、線性迴歸、卷積網絡、循環神經網絡等,同時支持定製的損失函數及梯度計算。Torch由於使用了LuaJIT,所以用戶在Lua中作數據預處理等操做能夠隨意使用循環等操做,而沒必要像在Python中那樣擔憂性能問題,也不須要學習Python中各類加速運算的庫。不過,Lua相比Python還不是那麼主流,對大多數用戶有學習成本。Torch在CPU上的計算會使用OpenMP、SSE進行優化,GPU上使用CUDA、cutorch、cunn、cuDNN進行優化,同時還有cuda-convnet的wrapper。Torch有不少第三方的擴展能夠支持RNN,使得Torch基本支持全部主流的網絡。和Caffe相似的是,Torch也是主要基於Layer的鏈接來定義網絡的。Torch中新的Layer依然須要用戶本身實現,不過定義新Layer和定義網絡的方式很類似,很是簡便,不像Caffe那麼麻煩,用戶須要使用C++或者CUDA定義新Layer。同時,Torch屬於命令式編程模式,不像Theano、TensorFlow屬於聲明性編程(計算圖是預約義的靜態的結構),因此用它實現某些複雜操做(好比beam search)比Theano和TensorFlow方便不少。

  PyTorch是Torch計算引擎的python前端,不只可以提供Torch的高性能,還可以對GPU的提供更好支持。該框架的開發者表示,PyTorch與Torch的區別在於它不只僅是封裝,而是進行了深度集成的框架,這使得PyTorc在網絡構建方面具備更高的靈活性。(以下圖)。

 

 

4、Theano 

4.1 Theano簡述。

  Theano於2008年在蒙特利爾理工學院誕生,它派生出了大量深度學習Python軟件包,最著名的包括Blocks和Keras。這個由希臘神話中伊卡里亞島國王妻子名字命名的框架,是由本吉奧領導的蒙特利爾大學機器學習研究小組(MILA,開發時叫LISA)開發的。

  Theano是使用符號邏輯建立網絡的框架,是以Python編寫的,但利用了numpy的高效代碼庫,從而提升了性能,超過了標準的Python。Theano在構建網絡方面有很大的優點,可是在創造完整的解決方案中則具備比較大的挑戰。Theano將機器學習中使用的梯度計算做爲網絡建立的「免費」副產品,對於那些但願更多地關注網絡架構而不是梯度計算的人來講,這多是有用的。此外,它的文本文件質量也至關不錯。

  但須要提醒你們的一點是,Theano目前已中止更新。

4.2 Theano介紹。

  首先,官方網址:官方網址:http://www.deeplearning.net/software/theano/  及其GitHub:github.com/Theano/Theano。

  Theano做爲一個誕生比Caffe早的框架,在早期Theano是深度學習領域最流行的軟件包。嚴格來講,Theano不是專門面向深度學習的,而是一個基於多維數組用於計算和優化數學表達式的數值軟件包,由於神經網絡的本質其實就是數學表達式,因此用Theano能夠很是靈活地從無到有地實現神經網絡的各類功能。Theano基於Python,最大的優勢是靈活,性能很是出色,缺點是基於函數式的編程方式,還有拗口的API,異常困難的調試等,造就了陡峭的學習曲線。另外,其異常慢的編譯速度也經常遭人詬病。

  直接在Theano中開發雖然靈活度最高,但開發工做量和難度也不小,因此在Theano基礎上有不少封裝事後框架,好比MILA官方的Pylearn2,還有第三方開發的Lasagne和Keras等。Pylearn2因爲把Theano的缺點又進一步發揮到了極致,在火了一小陣後就被漸漸冷落,現在已經中止了實際意義上的開發。後兩個框架正在蓬勃發展中,尤爲是Keras,漸漸開始成爲一個脫離底層實現的大框架,目前除了Theano也支持了Google的Tensorflow。

  因其出現時間早,能夠算是這類庫的始祖之一,也一度被認爲是深度學習研究和應用的重要標準之一。Theano的核心是一個數學表達式的編譯器,專門爲處理大規模神經網絡訓練的計算而設計。它能夠將用戶定義的各類計算編譯爲高效的底層代碼,並連接各類能夠加速的庫,好比BLAS、CUDA等。Theano容許用戶定義、優化和評估包含多維數組的數學表達式,它支持將計算裝載到GPU(Theano在GPU上性能不錯,可是CPU上較差)。與Scikit-learn同樣,Theano也很好地整合了NumPy,對GPU的透明讓Theano能夠較爲方便地進行神經網絡設計,而沒必要直接寫CUDA代碼。Theano的主要優點以下:集成NumPy,能夠直接使用NumPy的ndarray,API接口學習成本低; 計算穩定性好,好比能夠精準地計算輸出值很小的函數(像log(1+x)); 動態地生成C或者CUDA代碼,用以編譯成高效的機器代碼。

  由於Theano很是流行,有許多人爲它編寫了高質量的文檔和教程,用戶能夠方便地查找Theano的各類FAQ,好比如何保存模型、如何運行模型等。不過Theano更多地被看成一個研究工具,而不是看成產品來使用。雖然Theano支持Linux、Mac和Windows,可是沒有底層C++的接口,所以模型的部署很是不方便,依賴於各類Python庫,而且不支持各類移動設備,因此幾乎沒有在工業生產環境的應用。Theano在調試時輸出的錯誤信息很是難以看懂,所以DEBUG時很是痛苦。同時,Theano在生產環境使用訓練好的模型進行預測時性能比較差,由於預測一般使用服務器CPU(生產環境服務器通常沒有GPU,並且GPU預測單條樣本延遲高反而不如CPU),可是Theano在CPU上的執行性能比較差。

  Theano在單GPU上執行效率不錯,性能和其餘框架相似。可是運算時須要將用戶的Python代碼轉換成CUDA代碼,再編譯爲二進制可執行文件,編譯複雜模型的時間很是久。此外,Theano在導入時也比較慢,並且一旦設定了選擇某塊GPU,就沒法切換到其餘設備。目前,Theano在CUDA和cuDNN上不支持多GPU,只在OpenCL和Theano本身的gpuarray庫上支持多GPU訓練,速度暫時還比不上CUDA的版本,而且Theano目前尚未分佈式的實現。不過,Theano在訓練簡單網絡(好比很淺的MLP)時性能可能比TensorFlow好,由於所有代碼都是運行時編譯,不須要像TensorFlow那樣每次feed mini-batch數據時都得經過低效的Python循環來實現。

  Theano是一個徹底基於Python(C++/CUDA代碼也是打包爲Python字符串)的符號計算庫。用戶定義的各類運算,Theano能夠自動求導,省去了徹底手工寫神經網絡反向傳播算法的麻煩,也不須要像Caffe同樣爲Layer寫C++或CUDA代碼。Theano對卷積神經網絡的支持很好,同時它的符號計算API支持循環控制(內部名scan),讓RNN的實現很是簡單而且高性能,其全面的功能也讓Theano能夠支持大部分state-of-the-art的網絡。Theano派生出了大量基於它的深度學習庫,包括一系列的上層封裝,其中有大名鼎鼎的Keras,Keras對神經網絡抽象得很是合適,以致於能夠隨意切換執行計算的後端(目前同時支持Theano和TensorFlow)。Keras比較適合在探索階段快速地嘗試各類網絡結構,組件都是可插拔的模塊,只須要將一個個組件(好比卷積層、激活函數等)鏈接起來,可是設計新模塊或者新的Layer就不太方便了。除Keras外,還有學術界很是喜好的Lasagne,一樣也是Theano的上層封裝,它對神經內網絡的每一層的定義都很是嚴謹。另外,還有scikit-neuralnetwork、nolearn這兩個基於Lasagne的上層封裝,它們將神經網絡抽象爲兼容Scikit-learn接口的classifier和regressor,這樣就能夠方便地使用Scikit-learn中經典的fit、transform、score等操做。除此以外,Theano的上層封裝庫還有blocks、deepy、pylearn2和Scikit-theano,可謂是一個龐大的家族。若是沒有Theano,可能根本不會出現這麼多好用的Python深度學習庫。一樣,若是沒有Python科學計算的基石NumPy,就不會有SciPy、Scikit-learn和 Scikit-image,能夠說Theano就是深度學習界的NumPy,是其餘各種Python深度學習庫的基石。雖然Theano很是重要,可是直接使用Theano設計大型的神經網絡仍是太煩瑣了,用 Theano實現Google Inception就像用NumPy實現一個支持向量機(SVM)。且不說不少用戶作不到用Theano實現一個Inception網絡,即便能作到可是否有必要花這個時間呢?畢竟不是全部人都是基礎科學工做者,大部分使用場景仍是在工業應用中。因此簡單易用是一個很重要的特性,這也就是其餘上層封裝庫的價值所在:不須要老是從最基礎的tensor粒度開始設計網絡,而是從更上層的Layer粒度設計網絡。

 

5、Keras 

5.1 Keras 簡述。

  Keras它的句法是至關明晰的,文檔也很是好(儘管相對較新),並且它支持Python語言。它的使用很是簡單輕鬆;咱們也能很直觀地瞭解它的指令、函數和每一個模塊之間的連接方式。 Keras是一個很是高層的庫,能夠工做在 Theano 和 TensorFlow(能夠配置)之上。另外,Keras強調極簡主義——你只需幾行代碼就能構建一個神經網絡。在這裏你能夠比較一下 Keras和TensorFlow 實現相同功能時所需的代碼。

 

5.2 Keras 介紹。

  官方網址:keras.io  及其GitHub:github.com/fchollet/keras

  Keras是用Python編寫的框架,能夠做爲Theano或Tensorflow的後端。這使得Keras在構建完整的解決方案中更容易,並且由於每一行代碼都建立了一個網絡層,因此它也更易於閱讀。此外,Keras還擁有最早進算法(優化器(optimizers)、歸一化例程(normalization routines)、激活函數(activation functions))的最佳選擇。

需說明:雖然Keras支持Theano和Tensorflow後端,但輸入數據的維度假設是不一樣的,所以需仔細的設計才能使代碼支持兩個後端工做。該項目有完備的文本文件,並提供了一系列針對各類問題的實例以及訓練好了的、用於傳輸學習實現經常使用體系的結構模型。在編寫的時候,有消息宣稱Tensorflow將採用Keras做爲首選的高級包。其實,這並不奇怪,由於Keras的開發者Francois Chollet自己就是谷歌的軟件工程師。

  Keras是一個崇尚極簡、高度模塊化的神經網絡庫,使用Python實現,並能夠同時運行在TensorFlow和Theano上。它旨在讓用戶進行最快速的原型實驗,讓想法變爲結果的這個過程最短。Theano和TensorFlow的計算圖支持更通用的計算,而Keras則專精於深度學習。Theano和TensorFlow更像是深度學習領域的NumPy,而Keras則是這個領域的Scikit-learn。它提供了目前爲止最方便的API,用戶只須要將高級的模塊拼在一塊兒,就能夠設計神經網絡,它大大下降了編程開銷(code overhead)和閱讀別人代碼時的理解開銷(cognitive overhead)。它同時支持卷積網絡和循環網絡,支持級聯的模型或任意的圖結構的模型(可讓某些數據跳過某些Layer和後面的Layer對接,使得建立Inception等複雜網絡變得容易),從CPU上計算切換到GPU加速無須任何代碼的改動。由於底層使用Theano或TensorFlow,用Keras訓練模型相比於前二者基本沒有什麼性能損耗(還能夠享受前二者持續開發帶來的性能提高),只是簡化了編程的複雜度,節約了嘗試新網絡結構的時間。能夠說模型越複雜,使用Keras的收益就越大,尤爲是在高度依賴權值共享、多模型組合、多任務學習等模型上,Keras表現得很是突出。Keras全部的模塊都是簡潔、易懂、徹底可配置、可隨意插拔的,而且基本上沒有任何使用限制,神經網絡、損失函數、優化器、初始化方法、激活函數和正則化等模塊都是能夠自由組合的。Keras也包括絕大部分state-of-the-art的Trick,包括Adam、RMSProp、Batch Normalization、PReLU、ELU、LeakyReLU等。同時,新的模塊也很容易添加,這讓Keras很是適合最前沿的研究。Keras中的模型也都是在Python中定義的,不像Caffe、CNTK等須要額外的文件來定義模型,這樣就能夠經過編程的方式調試模型結構和各類超參數。在Keras中,只須要幾行代碼就能實現一個MLP,或者十幾行代碼實現一個AlexNet,這在其餘深度學習框架中基本是不可能完成的任務。Keras最大的問題多是目前沒法直接使用多GPU,因此對大規模的數據處理速度沒有其餘支持多GPU和分佈式的框架快。Keras的編程模型設計和Torch很像,可是相比Torch,Keras構建在Python上,有一套完整的科學計算工具鏈,而Torch的編程語言Lua並無這樣一條科學計算工具鏈。不管從社區人數,仍是活躍度來看,Keras目前的增加速度都已經遠遠超過了Torch。

 

6、MXNet

6.1 MXNet簡述。

  MXnet出自CXXNet、Minerva、Purine等項目的開發者之手,主要用C++編寫。MXNet強調提升內存使用的效率,甚至能在智能手機上運行諸如圖像識別等任務。它支持大多數編程語言的框架之一,包括 Python,R,C++,Julia 等。使用 R 語言的開發者會特別偏心 mxnet,由於至今爲止仍是 Python 以不可置疑的態勢稱霸深度學習語言的。

  MXNet前身是DMLC的CXXNet和Minerva,這兩個項目一個經過配置和定義來訓練網絡,而另外一個則提供了相似numpy同樣的多維數組的用法。MXNet無縫地銜接了這兩種用法,得到了很是好的靈活性,這是另外一個特色。MXNet支持語言很是多,尤爲是對R的支持,贏得了一批統計領域的用戶,而且擴展性也不錯,能夠說是一個很是有潛力的框架。此外,MXNet還有一個很大的特色是文檔很是「爛」。2016年底,Amazon宣佈MXNet爲其官方深度學習平臺,並會提供進一步支持,這個問題彷佛有望被解決。後續MXNet是否能進一步崛起,並和TensorFlow還有Caffe一較高下,咱們拭目以待。

 

6.2 MXNet介紹。

  官網網址:mxnet.io 以及GitHub:github.com/dmlc/mxnet

  MXNet是DMLC(Distributed Machine Learning Community)開發的一款開源的、輕量級、可移植的、靈活的深度學習庫,它讓用戶能夠混合使用符號編程模式和指令式編程模式來最大化效率和靈活性,目前已是AWS官方推薦的深度學習框架。MXNet的不少做者都是中國人,其最大的貢獻組織爲百度,同時不少做者來自cxxnet、minerva和purine2等深度學習項目,可謂博採衆家之長。它是各個框架中率先支持多GPU和分佈式的,同時其分佈式性能也很是高。MXNet的核心是一個動態的依賴調度器,支持自動將計算任務並行化到多個GPU或分佈式集羣(支持AWS、Azure、Yarn等)。它上層的計算圖優化算法可讓符號計算執行得很是快,並且節約內存,開啓mirror模式會更加省內存,甚至能夠在某些小內存GPU上訓練其餘框架因顯存不夠而訓練不了的深度學習模型,也能夠在移動設備(Android、iOS)上運行基於深度學習的圖像識別等任務。此外,MXNet的一個很大的優勢是支持很是多的語言封裝,好比C++、Python、R、Julia、Scala、Go、MATLAB和JavaScript等,可謂很是全面,基本主流的腳本語言所有都支持了。在MXNet中構建一個網絡須要的時間可能比Keras、Torch這類高度封裝的框架要長,可是比直接用Theano等要快。MXNet的各級系統架構(下面爲硬件及操做系統底層,逐層向上爲愈來愈抽象的接口)如圖2-6所示。

  MXNet是DMLC(Distributed Machine Learning Community)開發的一款開源的、輕量級、可移植的、靈活的深度學習庫,它讓用戶能夠混合使用符號編程模式和指令式編程模式來最大化效率和靈活性,目前已是AWS官方推薦的深度學習框架。MXNet的不少做者都是中國人,其最大的貢獻組織爲百度,同時不少做者來自cxxnet、minerva和purine2等深度學習項目,可謂博採衆家之長。它是各個框架中率先支持多GPU和分佈式的,同時其分佈式性能也很是高。MXNet的核心是一個動態的依賴調度器,支持自動將計算任務並行化到多個GPU或分佈式集羣(支持AWS、Azure、Yarn等)。它上層的計算圖優化算法可讓符號計算執行得很是快,並且節約內存,開啓mirror模式會更加省內存,甚至能夠在某些小內存GPU上訓練其餘框架因顯存不夠而訓練不了的深度學習模型,也能夠在移動設備(Android、iOS)上運行基於深度學習的圖像識別等任務。此外,MXNet的一個很大的優勢是支持很是多的語言封裝,好比C++、Python、R、Julia、Scala、Go、MATLAB和JavaScript等,可謂很是全面,基本主流的腳本語言所有都支持了。在MXNet中構建一個網絡須要的時間可能比Keras、Torch這類高度封裝的框架要長,可是比直接用Theano等要快。MXNet的各級系統架構(下面爲硬件及操做系統底層,逐層向上爲愈來愈抽象的接口)如圖所示。

 

7、其餘深度學習框架

  下面依次介紹其餘深度學習框架:Cuda-convnet二、Neon、 Deeplearning4j、CNTK、Brainstorm、Chainer、Marvin、ConvNetJS、DIGITS、DL4J、DIGITS、Leaf等。

7.1 Cuda-convnet2:由2012年讓深度學習在視覺領域聲名大噪的AlexNet做者,辛頓的學生阿歷克斯·克里澤夫斯基(Alex Krizhevsky)開發。做爲一名學術工程雙馨的天才,其開發的cuda-convnet2性能曾經很是強悍,不過不知什麼緣由,最近也中止更新了。

7.2 Neon由一家結合了深度學習人才和硬件人才的創業公司Nervana Systems於2015年開源發佈。這是一個比較獨特的框架,由於其公司軟硬結合的血統,在硬件優化上的造詣讓這個框架在發佈時在很多基準測試上達到了世界最佳的成績。2016年中,Nervana System被Intel收購,此前Intel還收購了FPGA供應商Altera,也許Intel很快就會憋出個大招?拭目以待。在某些基準測試中,由Python和Sass開發的Neon的測試成績甚至要優於Caffeine、Torch和谷歌的TensorFlow。

7.3 Deeplearning4j顧名思義,Deeplearning4j是」for Java」的深度學習框架,也是首個商用級別的深度學習開源庫。Deeplearning4j由創業公司Skymind於2014年6月發佈,使用 Deeplearning4j的不乏埃森哲、雪弗蘭、博斯諮詢和IBM等明星企業。支持Java的機器學習庫,由Skymind發佈於2014年發佈,商業標準的開源框架,在一些歐美諮詢公司中受到歡迎。DeepLearning4j是一個面向生產環境和商業應用的高成熟度深度學習開源庫,可與Hadoop和Spark集成,即插即用,方便開發者在APP中快速集成深度學習功能,可應用於如下深度學習領域:人臉/圖像識別、語音搜索、語音轉文字(Speech to text)、垃圾信息過濾(異常偵測)、電商欺詐偵測等等。

7.4 CNTK全稱爲Computational Network Toolkit,是微軟出品的深度學習框架,於2016年初開源,因此目前使用者寥寥。該框架同時支持CPU和GPU,聽說性能極其強悍,在微軟官方博客上的測試中,超過了其餘全部常見框架。CNTK是由微軟開發的框架,並被描述爲機器學習的「Visual Studio」。對於那些使用Visual Studio進行編程的人,這多是一種更溫和、更有效的進入深度學習的CNTK(Computational Network Toolkit)是微軟研究院(MSR)開源的深度學習框架。它最先由start the deep learning craze的演講人建立,目前已經發展成一個通用的、跨平臺的深度學習系統,在語音識別領域的使用尤爲普遍。CNTK經過一個有向圖將神經網絡描述爲一系列的運算操做,這個有向圖中子節點表明輸入或網絡參數,其餘節點表明各類矩陣運算。CNTK支持各類前饋網絡,包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自動求解梯度。CNTK有豐富的細粒度的神經網絡組件,使得用戶不須要寫底層的C++或CUDA,就能經過組合這些組件設計新的複雜的Layer。CNTK擁有產品級的代碼質量,支持多機、多GPU的分佈式訓練。CNTK設計是性能導向的,在CPU、單GPU、多GPU,以及GPU集羣上都有很是優異的表現。同時微軟最近推出的1-bit compression技術大大下降了通訊代價,讓大規模並行訓練擁有了很高的效率。CNTK同時宣稱擁有很高的靈活度,它和Caffe同樣經過配置文件定義網絡結構,再經過命令行程序執行訓練,支持構建任意的計算圖,支持AdaGrad、RmsProp等優化方法。它的另外一個重要特性就是拓展性,CNTK除了內置的大量運算核,還容許用戶定義他們本身的計算節點,支持高度的定製化。CNTK在2016年9月發佈了對強化學習的支持,同時,除了經過寫配置文件的方式定義網絡結構,CNTK還將支持其餘語言的綁定,包括Python、C++和C#,這樣用戶就能夠用編程的方式設計網絡結構。CNTK與Caffe同樣也基於C++而且跨平臺,大部分狀況下,它的部署很是簡單。PC上支持Linux、Mac和Windows,可是它目前不支持ARM架構,限制了其在移動設備上的發揮。圖2-7所示爲CNTK目前的整體架構圖。CNTK原生支持多GPU和分佈式,從官網公佈的對比評測來看,性能很是不錯。在多GPU方面,CNTK相對於其餘的深度學習庫表現得更突出,它實現了1-bit SGD和自適應的mini-batching。圖2-8所示爲CNTK官網公佈的在2015年12月的各個框架的性能對比。在當時,CNTK是惟一支持單機8塊GPU的框架,而且在分佈式系統中能夠超越8塊GPU的性能。

Cognitive Toolkit認知工具包(Cognitive Toolkit)以前被你們所知的縮略是 CNTK,可是最近又重命名迴歸到 Cognitive Toolkit,極可能是想沾最近微軟認知服務(Microsoft Cognitive services)的光。在公開的基準測試上的表現來看,這個工具彷佛很強勁,支持縱向和橫向的推移。 目前爲止,Cognitive Toolkit 彷佛不是很流行。我並無讀到不少關於使用這個庫的博客、在線實驗案例或者在 Kaggle 裏的相關評論。可是對我來講,一個背靠微軟研究的框架特別強調本身的推移能力讓我以爲有些奇怪,畢竟微軟研究團隊但是在語音識別上打破世界紀錄並逼近人類水準。 我在查看他們項目百科的一個範例的時候瞭解到 Cognitive Toolkit 在 Python 上的語法和 Keras 是很是相相似的(Cognitive Toolkit 也支持 C++),這不由讓我在想(並非確認)Keras 纔是正確的方式。

7.5 Brainstorm來自瑞士人工智能實驗室IDSIA的一個很是發展前景很不錯的深度學習軟件包,Brainstorm可以處理上百層的超級深度神經網絡——所謂的公路網絡Highway Networks。

7.6 ChainerChainer是由日本公司Preferred Networks於2015年6月發佈的深度學習框架。Chainer的設計基於define by run原則,也就是說,該網絡在運行中動態定義,而不是在啓動時定義,這裏有Chainer的詳細文檔。 Chainer與其餘框架有點不一樣,它將網絡構建視爲其計算的一部分。它的開發者介紹說,在這一框架中,大多數工具都是「定義而後運行」,這意味着你要定義架構,而後才能運行它。Chainer嘗試構建並優化其架構,使其成爲學習過程的一部分,或者稱之爲「經過運行定義」。

Chainer對本身的特性描述以下:Powerful,支持CUDA計算,只須要幾行代碼就能夠使用GPU加速,同時只需少量改動就能夠運行在多GPU上。Flexible,支持多種前饋神經網絡,包括卷積網絡、循環網絡、遞歸網絡,支持運行中動態定義的網絡(Define-by-Run)。Intuitive,前饋計算能夠引入Python的各類控制流,同時反向傳播時不受干擾,簡化了調試錯誤的難度。絕大多數的深度學習框架是基於「Define-and-Run」的,也就是說,須要首先定義一個網絡,再向網絡中feed數據(mini-batch)。由於網絡是預先靜態定義的,全部的控制邏輯都須要以data的形式插入網絡中,包括像Caffe那樣定義好網絡結構文件,或者像Theano、Torch、TensorFlow等使用編程語言定義網絡。而Chainer則相反,網絡是在實際運行中定義的,Chainer存儲歷史運行的計算結果,而不是網絡的結構邏輯,這樣就能夠方便地使用Python中的控制流,因此無須其餘工做就能夠直接在網絡中使用條件控制和循環。

7.7 Marvin是普林斯頓大學視覺工做組新推出的C++框架。該團隊還提供了一個文件用於將Caffe模型轉化成語Marvin兼容的模式。

7.8 ConvNetJS這是斯坦福大學博士生Andrej Karpathy開發瀏覽器插件,基於萬能的JavaScript能夠在你的遊覽器中訓練神經網絡。Karpathy還寫了一個ConvNetJS的入門教程,以及一個簡潔的瀏覽器演示項目。

7.9 DIGITS: 是由英偉達開發的,一款基於網絡的深層開發工具。在不少方面,它像Caffe同樣,可以使用文本文件而不是編程語言來描述網絡和參數。它具備網絡可視化工具,所以文本文件中的錯誤更容易被識別出來。此外,它還具備用於可視化學習過程的工具,並支持多個GPU。

7.10 DL4JDeeplearning4J(簡稱DL4J)是一個基於Java和Scala的開源的分佈式深度學習庫,由Skymind於2014年6月發佈,其核心目標是建立一個即插即用的解決方案原型。埃森哲、雪弗蘭、博斯諮詢和IBM等都是DL4J的客戶。DL4J擁有一個多用途的n-dimensional array的類,能夠方便地對數據進行各類操做;擁有多種後端計算核心,用以支持CPU及GPU加速,在圖像識別等訓練任務上的性能與Caffe至關;能夠與Hadoop及Spark自動整合,同時能夠方便地在現有集羣(包括但不限於AWS,Azure等)上進行擴展,同時DL4J的並行化是根據集羣的節點和鏈接自動優化,不像其餘深度學習庫那樣可能須要用戶手動調整。DL4J選擇Java做爲其主要語言的緣由是,目前基於Java的分佈式計算、雲計算、大數據的生態很是龐大。用戶可能擁有大量的基於Hadoop和Spark的集羣,所以在這類集羣上搭建深度學習平臺的需求便很容易被DL4J知足。同時JVM的生態圈內還有數不勝數的Library的支持,而DL4J也建立了ND4J,能夠說是JVM中的NumPy,支持大規模的矩陣運算。此外,DL4J還有商業版的支持,付費用戶在出現問題時能夠經過電話諮詢尋求支持。

借用某網友的話「我接觸這一庫,是由於它的 documentation。當時我正在尋找受限玻爾茲曼機、自編碼器,在 DL4J 中找到了這兩個 documentation。裏面的文件很清楚,有理論,有代碼案例。我必須得說 DL4J 的 documentation 簡直是藝術品,其餘庫在記錄代碼的時候須要向它學習。DL4J 背後的公司 Skymind 意識到,雖然在深度學習圈內 Python 是老大,但大部分程序員起自 Java,因此須要找到一個解決方案。DL4J 兼容 JVM,也適用 Java、Clojure 和 Scala,隨着 Scala 的起起落落,它也被不少有潛力的創業公司使用,因此我還會繼續緊追這個庫。 此外,Skymind 的 twitter 帳戶很是活躍,不斷公開最新的科學論文、案例和教程,及其推薦你們關注。」

7.11 DIGITS Deep Learning GPU Training System,不是一個標準的深度學習庫,它能夠算是一個Caffe的高級封裝(或者Caffe的Web版培訓系統)。由於封裝得很是重,以致於你不須要(也不能)在DIGITS中寫代碼,便可實現一個深度學習的圖片識別模型。在Caffe中,定義模型結構、預處理數據、進行訓練並監控訓練過程是相對比較煩瑣的,DIGITS把全部這些操做都簡化爲在瀏覽器中執行。它能夠算做Caffe在圖片分類上的一個漂亮的用戶可視化界面(GUI),計算機視覺的研究者或者工程師能夠很是方便地設計深度學習模型、測試準確率,以及調試各類超參數。同時使用它也能夠生成數據和訓練結果的可視化統計報表,甚至是網絡的可視化結構圖。訓練好的Caffe模型能夠被DIGITS直接使用,上傳圖片到服務器或者輸入url便可對圖片進行分類。

7.12 Leaf 是一個基於Rust語言的直觀的跨平臺的深度學習乃至機器智能框架,它擁有一個清晰的架構,除了同屬Autumn AI的底層計算庫Collenchyma,Leaf沒有其餘依賴庫。它易於維護和使用,而且擁有很是高的性能。Leaf自身宣傳的特色是爲Hackers定製的,這裏的Hackers是指但願用最短的時間和最少的精力實現機器學習算法的技術極客。它的可移植性很是好,能夠運行在CPU、GPU和FPGA等設備上,能夠支持有任何操做系統的PC、服務器,甚至是沒有操做系統的嵌入式設備,而且同時支持OpenCL和CUDA。Leaf是Autumn AI計劃的一個重要組件,後者的目標是讓人工智能算法的效率提升100倍。憑藉其優秀的設計,Leaf能夠用來建立各類獨立的模塊,好比深度強化學習、可視化監控、網絡部署、自動化預處理和大規模產品部署等。

Leaf擁有最簡單的API,但願能夠最簡化用戶須要掌握的技術棧。雖然纔剛誕生不久,Leaf就已經躋身最快的深度學習框架之一了。圖2-9所示爲Leaf官網公佈的各個框架在單GPU上訓練VGG網絡的計算時間(越小越好)的對比(這是和早期的TensorFlow對比,最新版的TensorFlow性能已經很是好了)。

7.13 DSSTNE(Deep Scalable Sparse Tensor Network Engine)是亞馬遜開源的稀疏神經網絡框架,在訓練很是稀疏的數據時具備很大的優點。DSSTNE目前只支持全鏈接的神經網絡,不支持卷積網絡等。和Caffe相似,它也是經過寫一個JSON類型的文件定義模型結構,可是支持很是大的Layer(輸入和輸出節點都很是多);在激活函數、初始化方式及優化器方面基本都支持了state-of-the-art的方法,比較全面;支持大規模分佈式的GPU訓練,不像其餘框架同樣主要依賴數據並行,DSSTNE支持自動的模型並行(使用數據並行須要在訓練速度和模型準確度上作必定的trade-off,模型並行沒有這個問題)。

在處理特徵很是多(上億維)的稀疏訓練數據時(常常在推薦、廣告、天然語言處理任務中出現),即便一個簡單的3個隱層的MLP(Multi-Layer Perceptron)也會變成一個有很是多參數的模型(可能高達上萬億)。以傳統的稠密矩陣的方式訓練方法很難處理這麼多的模型參數,更沒必要提超大規模的數據量,而DSSTNE有整套的針對稀疏數據的優化,率先實現了對超大稀疏數據訓練的支持,同時在性能上作了很是大的改進。

在DSSTNE官方公佈的測試中,DSSTNE在MovieLens的稀疏數據上,在單M40 GPU上取得了比TensorFlow快14.8倍的性能提高(注意是和老版的TensorFlow比較),如圖2-10所示。一方面是由於DSSTNE對稀疏數據的優化;另外一方面是TensorFlow在數據傳輸到GPU上時花費了大量時間,而DSSTNE則優化了數據在GPU內的保留;同時DSSTNE還擁有自動模型並行功能,而TensorFlow中則須要手動優化,沒有自動支持。

8、其餘知識拓展認識

8.1計算機語言

  深度學習的框架:編寫框架所使用的計算機語言會影響到它的有效性。儘管許多框架具備綁定機制,容許使用者使用與編寫框架不一樣的語言訪問框架,可是編寫框架所使用的語言也不可避免地在某種程度上影響後期開發的語言的靈活性。

  所以,在應用深度學習模型時,最好可以使用你所熟悉的計算機語言的框架。例如,Caffe(C++)和Torch(Lua)爲其代碼庫提供了Python綁定,但若是你想更好地使用這些技術,就必須可以熟練使用C++或者Lua。相比之下,TensorFlow和MXNet則能夠支持多語言,即便使用者不能熟練使用C++,也能夠很好地利用該技術。

8.2 教程(Tutorials)和訓練樣本

  框架的文本質量、覆蓋範圍以及示例對於有效使用框架相當重要。高質量的文本文件以及待處理的問題的示例將有助於有效解決開發者的問題。完備的文件也代表該工具已經成熟而且在短時間內不會改變。

  而不一樣的深度學習框架在教程和訓練樣本的質量和數量的需求方面存在很大的區別。舉例來講:Theano、TensorFlow、Torch和MXNet因爲具備很好的文本化教程(documented tutorials),因此很是易於理解和實現。另外,咱們還發現,不一樣的框架在GitHub社區的參與度和活躍度高低不只能夠做爲其將來發展的重要指標,同時也能夠用來衡量經過搜索StackOverflow或Git報告事件來檢測和修復bug的速度。值得注意的是,在教程數量、訓練樣本以及開發人員和用戶社區方面,TensorFlow的需求量很是很是大(像是一個800磅重的大猩猩同樣的龐然大物)。

8.3 CNN建模能力

  卷積神經網絡(CNN)是由一組不一樣的層組成,將初始數據量轉換成預約義類分數的輸出分數。CNN是一種前饋神經網絡,它的人工神經元能夠響應一部分覆蓋範圍內的周圍單元,對於大型圖像處理有出色表現,可用於圖像識別、推薦引擎和天然語言處理。此外,CNN還能夠用於迴歸分析,如自動駕駛車輛轉向角輸出模型等等。CNN建模能力包括幾個功能:定義模型的機率空間、預構建層的可用性以及可用於鏈接這些層的工具和功能。咱們看到,Theano、Caffe和MXNet都具備很好的CNN建模功能,這意味着,TensorFlow可以很容易地在其InceptionV3模型上進行能力構建,Torch中包括易於使用的時間卷積集在內的優秀的CNN資源,都使得這兩種技術在CNN建模功能上可以很好地區分開來。

8.4 RNN建模能力

  有別於CNN,遞歸神經網絡(RNN)能夠用於語音識別、時間序列預測、圖像字幕和其餘須要處理順序信息的任務。因爲預先構建的RNN模型不像CNN那樣多,所以,若是你有一個RNN深度學習項目,那麼就必須考慮爲特定技術預先實施和開源何種RNN模型,這是很是重要的。例如,Caffe擁有極少的RNN資源,而微軟的CNTK和Torch則擁有豐富的RNN教程和預置模型。雖然TensorFlow也具備一些RNN資源,但TFLearn和Keras中所包含的RNN示例要比使用TensorFlow多得多。

8.5 架構

  爲了在特定的框架中建立和訓練新的模型,相當重要的一點是要有一個易於使用並且是模塊化的前端架構。檢測結果代表,TensorFlow、Torch和MXNet都具備直觀的模塊化架構,這使得開發變得簡單而且直觀。相比之下,像Caffe這樣的框架則須要花大量的工做來建立一個新的層。另外,咱們還發現因爲TensorBoard Web GUI應用程序已經被包含在內,TensorFlow在訓練期間和訓練以後會特別容易調試和監控。

8.6 速度

  在開放源代碼卷積神經網絡(CNN)方面Torch和Nervana擁有基準測試的最佳性能記錄,TensorFlow性能在大多數測試中也「有的一拼」,而Caffe和Theano在這方面則表現得並不突出;在遞歸神經網絡(RNN)方面,微軟則聲稱CNTK的訓練時長最短,速度最快。固然,也有另外一項直接針對RNN建模能力速度進行比較的研究代表,在Theano、Torch和TensorFlow中,Theano的表現最好。

 

8.7 多GPU支持

  大多數深度學習應用程序須要大量的浮點運算(FLOP)。例如,百度的DeepSpeech識別模型須要10秒鐘的ExaFLOPs(百萬兆浮點運算)進行訓練。那但是大於10的18次方的計算量!而做爲領先的圖形處理單元(GPU)——如英偉達的Pascal TitanX,每秒能夠執行11萬億次浮點運算,在一個足夠大的數據集上訓練一個新的模型須要一週的時間。爲了減小構建模型所需的時間,須要多臺機器上的多個GPU。幸運的是,上面列出的大多數技術都提供了這種支持,好比,MXNet就具備一個高度優化的多GPU引擎。

8.8 Keras兼容性

  Keras是一個用於進行快速深度學習原型設計的高級庫,是一個讓數據科學家可以自如地應用深度學習的工具。Keras目前支持兩個後端——TensorFlow和Theano,而且還將在TensorFlow中得到正式的支持。

  Matthew Rubashkin建議,當你要開始一個深度學習項目時,首先要評估好本身團隊的技能和項目需求。舉例來講,對於以Python爲中心的團隊的圖像識別應用程序,他建議使用TensorFlow,由於其文本文件豐富、性能適宜而且還擁有優秀的原型設計工具。而若是是爲了將RNN擴展到具備Lua能力的客戶團隊產品上,他則推薦使用Torch,這是由於它具備卓越的速度和RNN建模能力。

  總而言之,對於大多數人而言,「從零開始」編寫深度學習算法成本很是高,而利用深度學習框架中可用的巨大資源是更有效率的。如何選擇更合適的框架將取決於使用者的技能和背景,以及具體項目的需求。所以,當你要開始一個深度學習項目時,的確值得花一些時間來評估可用的框架,以確保技術價值的最大化。

相關文章
相關標籤/搜索