日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 人工智能 > pytorch >内容正文

pytorch

深度学习的常用框架

發(fā)布時間:2025/3/15 pytorch 18 豆豆
生活随笔 收集整理的這篇文章主要介紹了 深度学习的常用框架 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

目?錄

一、Caffe?(源于Berkeley的主流CV工具包)

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

三、Torch?(Facebook用的卷積神經(jīng)網(wǎng)絡(luò)工具包)

四、Theano?

五、Keras?

六、MXNet

七、其他深度學習框架

八、其他知識拓展認識

前言:深度學習框架是幫助使用者進行深度學習的工具,它的出現(xiàn)降低了深度學習入門的門檻,你不需要從復雜的神經(jīng)網(wǎng)絡(luò)開始編代碼,就可以根據(jù)需要使用現(xiàn)有的模型。各種開源深度學習框架也層出不窮,其中包括Caffe、TensorFlow、Keras、Torch7、MXNet、CNTK、Leaf、Theano、DeepLearning4、Lasagne、Neon等等。不同框架之間的“好與壞”,沒有一個統(tǒng)一的標準。

本人僅是深度學習的探索者,綜合網(wǎng)上前輩的資源,先給出一個表“各個開源框架在GitHub上的數(shù)據(jù)統(tǒng)計”,然后對其中的幾個分別進行如下總結(jié):

一、Caffe?(源于Berkeley的主流CV工具包)

1.1?Caffe簡述。

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

  Caffe基于C++和英偉達(NVIDIA)公司的GPU(Graphic?Processing?Unit)通用計算架構(gòu)CUDA(Compute?Unified?Device?Architecture)開發(fā),特點是高效、可配置化的輸入、GPU和CPU的無縫切換。當然還有非常重要的一點,Caffe擁有龐大的社區(qū),無論是科研領(lǐng)域還是業(yè)界都有大量的用戶。每當一些最前沿的深度學習方法發(fā)表后,沒多久就會有官方的預訓練模型或是第三方基于Caffe的實現(xiàn),所以Caffe是一個對初學者和有經(jīng)驗的人都非常適合的工具。

  值得注意的是:Caffe是目前最成熟的框架,雖然有被TensorFlow趕超之勢,但是對于初學者而言最容易找到的資料還是Caffe,而且Caffe上手難度略低于TensorFlow。MXNet的上手難度低,非常適合初學者。一直以來遭到詬病的文檔“爛”問題隨著Amazon的支持應(yīng)該會慢慢改善,潛力很好。

?

1.2?Caffe介紹。

  首先,官方網(wǎng)址:caffe.berkeleyvision.org/?及其GitHub:github.com/BVLC/caffe

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

  繼續(xù)了解Caffe。?Caffe的核心概念是Layer,每一個神經(jīng)網(wǎng)絡(luò)的模塊都是一個Layer。Layer接收輸入數(shù)據(jù),同時經(jīng)過內(nèi)部計算產(chǎn)生輸出數(shù)據(jù)。設(shè)計網(wǎng)絡(luò)結(jié)構(gòu)時,只需要把各個Layer拼接在一起構(gòu)成完整的網(wǎng)絡(luò)(通過寫protobuf配置文件定義)。比如卷積的Layer,它的輸入就是圖片的全部像素點,內(nèi)部進行的操作是各種像素值與Layer參數(shù)的convolution操作,最后輸出的是所有卷積核filter的結(jié)果。每一個Layer需要定義兩種運算,一種是正向(forward)的運算,即從輸入數(shù)據(jù)計算輸出結(jié)果,也就是模型的預測過程;另一種是反向(backward)的運算,從輸出端的gradient求解相對于輸入的gradient,即反向傳播算法,這部分也就是模型的訓練過程。實現(xiàn)新Layer時,需要將正向和反向兩種計算過程的函數(shù)都實現(xiàn),這部分計算需要用戶自己寫C++或者CUDA(當需要運行在GPU時)代碼,對普通用戶來說還是非常難上手的。正如它的名字Convolutional?Architecture?for?Fast?Feature?Embedding所描述的,Caffe最開始設(shè)計時的目標只針對于圖像,沒有考慮文本、語音或者時間序列的數(shù)據(jù),因此Caffe對卷積神經(jīng)網(wǎng)絡(luò)的支持非常好,但對時間序列RNN、LSTM等支持得不是特別充分。同時,基于Layer的模式也對RNN不是非常友好,定義RNN結(jié)構(gòu)時比較麻煩。在模型結(jié)構(gòu)非常復雜時,可能需要寫非常冗長的配置文件才能設(shè)計好網(wǎng)絡(luò),而且閱讀時也比較費力。

  Caffe的一大優(yōu)勢是擁有大量的訓練好的經(jīng)典模型(AlexNet、VGG、Inception)乃至其他state-of-the-art(ResNet等)的模型,收藏在它的Model?Zoo(github.com/BVLC/?caffe/wiki/Model-Zoo)。因為知名度較高,Caffe被廣泛地應(yīng)用于前沿的工業(yè)界和學術(shù)界,許多提供源碼的深度學習的論文都是使用Caffe來實現(xiàn)其模型的。在計算機視覺領(lǐng)域Caffe應(yīng)用尤其多,可以用來做人臉識別、圖片分類、位置檢測、目標追蹤等。雖然Caffe主要是面向?qū)W術(shù)圈和研究者的,但它的程序運行非常穩(wěn)定,代碼質(zhì)量比較高,所以也很適合對穩(wěn)定性要求嚴格的生產(chǎn)環(huán)境,可以算是第一個主流的工業(yè)級深度學習框架。因為Caffe的底層是基于C++的,因此可以在各種硬件環(huán)境編譯并具有良好的移植性,支持Linux、Mac和Windows系統(tǒng),也可以編譯部署到移動設(shè)備系統(tǒng)如Android和iOS上。和其他主流深度學習庫類似,Caffe也提供了Python語言接口pycaffe,在接觸新任務(wù),設(shè)計新網(wǎng)絡(luò)時可以使用其Python接口簡化操作。不過,通常用戶還是使用Protobuf配置文件定義神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),再使用command?line進行訓練或者預測。Caffe的配置文件是一個JSON類型的.prototxt文件,其中使用許多順序連接的Layer來描述神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)。Caffe的二進制可執(zhí)行程序會提取這些.prototxt文件并按其定義來訓練神經(jīng)網(wǎng)絡(luò)。理論上,Caffe的用戶可以完全不寫代碼,只是定義網(wǎng)絡(luò)結(jié)構(gòu)就可以完成模型訓練了。Caffe完成訓練之后,用戶可以把模型文件打包制作成簡單易用的接口,比如可以封裝成Python或MATLAB的API。不過在.prototxt文件內(nèi)部設(shè)計網(wǎng)絡(luò)節(jié)構(gòu)可能會比較受限,沒有像TensorFlow或者Keras那樣在Python中設(shè)計網(wǎng)絡(luò)結(jié)構(gòu)方便、自由。更重要的是,Caffe的配置文件不能用編程的方式調(diào)整超參數(shù),也沒有提供像Scikit-learn那樣好用的estimator可以方便地進行交叉驗證、超參數(shù)的Grid?Search等操作Caffe在GPU上訓練的性能很好(使用單塊GTX?1080訓練AlexNet時一天可以訓練上百萬張圖片),但是目前僅支持單機多GPU的訓練,沒有原生支持分布式的訓練。慶幸的是,現(xiàn)在有很多第三方的支持,比如雅虎開源的CaffeOnSpark,可以借助Spark的分布式框架實現(xiàn)Caffe的大規(guī)模分布式訓練。

?

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

2.1?TensorFlow簡述。

  一個由谷歌開發(fā)的的深度學習框架,TensorBoard可視化很方便,數(shù)據(jù)和模型并行化好、速度快,提供了調(diào)整網(wǎng)絡(luò)和監(jiān)控性能的工具,就像Tensorboard一樣,它還有一個可用作網(wǎng)絡(luò)應(yīng)用程序的教育工具。TensorFlow?支持?Python?和?C++,也允許在?CPU?和?GPU?上的計算分布,甚至支持使用?gRPC?進行水平擴展。隨著TensorFlow的持續(xù)改進以及Google光環(huán)的照耀,現(xiàn)在TensorFlow正在變得越來越流行。截至2016年5月,在github上關(guān)于TensorFlow的相關(guān)討論的數(shù)量已經(jīng)超過Caffe躍居第一位。

?

2.2?TensorFlow介紹。

  在?TensorFlow?的官網(wǎng)上,它被定義為“一個用于機器智能的開源軟件庫”,但有作者認為說“TensorFlow?是一個使用數(shù)據(jù)流圖(data?flow?graphs)進行數(shù)值計算的開源軟件庫。在這里,他們沒有將?TensorFlow?包含在「深度學習框架」范圍內(nèi),而是和?Theano?一起被包含在「圖編譯器(graph?compilers)」類別中。?在結(jié)束了?Udacity?的?Deep?Learning?課程(https://www.udacity.com/course/deep-learning–ud730)之后,我的感覺是?TensorFlow?是一個非常好的框架,但是卻非常低層。使用?TensorFlow?需要編寫大量的代碼,你必須一遍又一遍地重新發(fā)明輪子。”

  TensorFlow是一個相對高階的機器學習庫,用戶可以方便地用它設(shè)計神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),而不必為了追求高效率的實現(xiàn)親自寫C++或CUDA代碼。它和Theano一樣都支持自動求導,用戶不需要再通過反向傳播求解梯度。其核心代碼和Caffe一樣是用C++編寫的,使用C++簡化了線上部署的復雜度,并讓手機這種內(nèi)存和CPU資源都緊張的設(shè)備可以運行復雜模型(Python則會比較消耗資源,并且執(zhí)行效率不高)。除了核心代碼的C++接口,TensorFlow還有官方的Python、Go和Java接口,是通過SWIG(Simplified?Wrapper?and?Interface?Generator)實現(xiàn)的,這樣用戶就可以在一個硬件配置較好的機器中用Python進行實驗,并在資源比較緊張的嵌入式環(huán)境或需要低延遲的環(huán)境中用C++部署模型。SWIG支持給C/C++代碼提供各種語言的接口,因此其他腳本語言的接口未來也可以通過SWIG方便地添加。不過使用Python時有一個影響效率的問題是,每一個mini-batch要從Python中feed到網(wǎng)絡(luò)中,這個過程在mini-batch的數(shù)據(jù)量很小或者運算時間很短時,可能會帶來影響比較大的延遲。現(xiàn)在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也有內(nèi)置的TF.Learn和TF.Slim等上層組件可以幫助快速地設(shè)計新網(wǎng)絡(luò),并且兼容Scikit-learn?estimator接口,可以方便地實現(xiàn)evaluate、grid?search、cross?validation等功能。同時TensorFlow不只局限于神經(jīng)網(wǎng)絡(luò),其數(shù)據(jù)流式圖支持非常自由的算法表達,當然也可以輕松實現(xiàn)深度學習以外的機器學習算法。事實上,只要可以將計算表示成計算圖的形式,就可以使用TensorFlow。用戶可以寫內(nèi)層循環(huán)代碼控制計算圖分支的計算,TensorFlow會自動將相關(guān)的分支轉(zhuǎn)為子圖并執(zhí)行迭代運算。TensorFlow也可以將計算圖中的各個節(jié)點分配到不同的設(shè)備執(zhí)行,充分利用硬件資源。定義新的節(jié)點只需要寫一個Python函數(shù),如果沒有對應(yīng)的底層運算核,那么可能需要寫C++或者CUDA代碼實現(xiàn)運算操作。

  在數(shù)據(jù)并行模式上,TensorFlow和Parameter?Server很像,但TensorFlow有獨立的Variable?node,不像其他框架有一個全局統(tǒng)一的參數(shù)服務(wù)器,因此參數(shù)同步更自由。TensorFlow和Spark的核心都是一個數(shù)據(jù)計算的流式圖,Spark面向的是大規(guī)模的數(shù)據(jù),支持SQL等操作,而TensorFlow主要面向內(nèi)存足以裝載模型參數(shù)的環(huán)境,這樣可以最大化計算效率。

  TensorFlow的另外一個重要特點是它靈活的移植性,可以將同一份代碼幾乎不經(jīng)過修改就輕松地部署到有任意數(shù)量CPU或GPU的PC、服務(wù)器或者移動設(shè)備上。相比于Theano,TensorFlow還有一個優(yōu)勢就是它極快的編譯速度,在定義新網(wǎng)絡(luò)結(jié)構(gòu)時,Theano通常需要長時間的編譯,因此嘗試新模型需要比較大的代價,而TensorFlow完全沒有這個問題。TensorFlow還有功能強大的可視化組件TensorBoard,能可視化網(wǎng)絡(luò)結(jié)構(gòu)和訓練過程,對于觀察復雜的網(wǎng)絡(luò)結(jié)構(gòu)和監(jiān)控長時間、大規(guī)模的訓練很有幫助。TensorFlow針對生產(chǎn)環(huán)境高度優(yōu)化,它產(chǎn)品級的高質(zhì)量代碼和設(shè)計都可以保證在生產(chǎn)環(huán)境中穩(wěn)定運行,同時一旦TensorFlow廣泛地被工業(yè)界使用,將產(chǎn)生良性循環(huán),成為深度學習領(lǐng)域的事實標準。

  除了支持常見的網(wǎng)絡(luò)結(jié)構(gòu)(卷積神經(jīng)網(wǎng)絡(luò)(Convolutional?Neural?Network,CNN)、循環(huán)神經(jīng)網(wǎng)絡(luò)(Recurent?Neural?Network,RNN))外,TensorFlow還支持深度強化學習乃至其他計算密集的科學計算(如偏微分方程求解等)。TensorFlow此前不支持symbolic?loop,需要使用Python循環(huán)而無法進行圖編譯優(yōu)化,但最近新加入的XLA已經(jīng)開始支持JIT和AOT,另外它使用bucketing?trick也可以比較高效地實現(xiàn)循環(huán)神經(jīng)網(wǎng)絡(luò)。TensorFlow的一個薄弱地方可能在于計算圖必須構(gòu)建為靜態(tài)圖,這讓很多計算變得難以實現(xiàn),尤其是序列預測中經(jīng)常使用的beam?search。

  TensorFlow的用戶能夠?qū)⒂柧毢玫哪P头奖愕夭渴鸬蕉喾N硬件、操作系統(tǒng)平臺上,支持Intel和AMD的CPU,通過CUDA支持NVIDIA的GPU(最近也開始通過OpenCL支持AMD的GPU,但沒有CUDA成熟),支持Linux和Mac,最近在0.12版本中也開始嘗試支持Windows。在工業(yè)生產(chǎn)環(huán)境中,硬件設(shè)備有些是最新款的,有些是用了幾年的老機型,來源可能比較復雜,TensorFlow的異構(gòu)性讓它能夠全面地支持各種硬件和操作系統(tǒng)。同時,其在CPU上的矩陣運算庫使用了Eigen而不是BLAS庫,能夠基于ARM架構(gòu)編譯和優(yōu)化,因此在移動設(shè)備(Android和iOS)上表現(xiàn)得很好。

  TensorFlow在最開始發(fā)布時只支持單機,而且只支持CUDA?6.5和cuDNN?v2,并且沒有官方和其他深度學習框架的對比結(jié)果。在2015年年底,許多其他框架做了各種性能對比評測,每次TensorFlow都會作為較差的對照組出現(xiàn)。那個時期的TensorFlow真的不快,性能上僅和普遍認為很慢的Theano比肩,在各個框架中可以算是墊底。但是憑借Google強大的開發(fā)實力,很快支持了新版的cuDNN(目前支持cuDNN?v5.1),在單GPU上的性能追上了其他框架。

?  目前在單GPU的條件下,絕大多數(shù)深度學習框架都依賴于cuDNN,因此只要硬件計算能力或者內(nèi)存分配差異不大,最終訓練速度不會相差太大。但是對于大規(guī)模深度學習來說,巨大的數(shù)據(jù)量使得單機很難在有限的時間完成訓練。這時需要分布式計算使GPU集群乃至TPU集群并行計算,共同訓練出一個模型,所以框架的分布式性能是至關(guān)重要的。TensorFlow在2016年4月開源了分布式版本,使用16塊GPU可達單GPU的15倍提速,在50塊GPU時可達到40倍提速,分布式的效率很高。目前原生支持的分布式深度學習框架不多,只有TensorFlow、CNTK、DeepLearning4J、MXNet等。不過目前TensorFlow的設(shè)計對不同設(shè)備間的通信優(yōu)化得不是很好,其單機的reduction只能用CPU處理,分布式的通信使用基于socket的RPC,而不是速度更快的RDMA,所以其分布式性能可能還沒有達到最優(yōu)。

  Google?在2016年2月開源了TensorFlow?Serving,這個組件可以將TensorFlow訓練好的模型導出,并部署成可以對外提供預測服務(wù)的RESTful接口。有了這個組件,TensorFlow就可以實現(xiàn)應(yīng)用機器學習的全流程:從訓練模型、調(diào)試參數(shù),到打包模型,最后部署服務(wù),名副其實是一個從研究到生產(chǎn)整條流水線都齊備的框架。這里引用TensorFlow內(nèi)部開發(fā)人員的描述:“TensorFlow?Serving是一個為生產(chǎn)環(huán)境而設(shè)計的高性能的機器學習服務(wù)系統(tǒng)。它可以同時運行多個大規(guī)模深度學習模型,支持模型生命周期管理、算法實驗,并可以高效地利用GPU資源,讓TensorFlow訓練好的模型更快捷方便地投入到實際生產(chǎn)環(huán)境”。除了TensorFlow以外的其他框架都缺少為生產(chǎn)環(huán)境部署的考慮,而Google作為廣泛在實際產(chǎn)品中應(yīng)用深度學習的巨頭可能也意識到了這個機會,因此開發(fā)了這個部署服務(wù)的平臺。TensorFlow?Serving可以說是一副王牌,將會幫TensorFlow成為行業(yè)標準做出巨大貢獻。

  TensorBoard是TensorFlow的一組Web應(yīng)用,用來監(jiān)控TensorFlow運行過程,或可視化Computation?Graph。TensorBoard目前支持5種可視化:標量(scalars)、圖片(images)、音頻(audio)、直方圖(histograms)和計算圖(Computation?Graph)。TensorBoard的Events?Dashboard可以用來持續(xù)地監(jiān)控運行時的關(guān)鍵指標,比如loss、學習速率(learning?rate)或是驗證集上的準確率(accuracy);Image?Dashboard則可以展示訓練過程中用戶設(shè)定保存的圖片,比如某個訓練中間結(jié)果用Matplotlib等繪制(plot)出來的圖片;Graph?Explorer則可以完全展示一個TensorFlow的計算圖,并且支持縮放拖曳和查看節(jié)點屬性。

  TensorFlow擁有產(chǎn)品級的高質(zhì)量代碼,有Google強大的開發(fā)、維護能力的加持,整體架構(gòu)設(shè)計也非常優(yōu)秀。相比于同樣基于Python的老牌對手Theano,TensorFlow更成熟、更完善,同時Theano的很多主要開發(fā)者都去了Google開發(fā)TensorFlow(例如書籍Deep?Learning的作者Ian?Goodfellow,他后來去了OpenAI)。Google作為巨頭公司有比高校或者個人開發(fā)者多得多的資源投入到TensorFlow的研發(fā),可以預見,TensorFlow未來的發(fā)展將會是飛速的,可能會把大學或者個人維護的深度學習框架遠遠甩在身后。

?

三、Torch?(Facebook用的卷積神經(jīng)網(wǎng)絡(luò)工具包)

3.1?Torch簡述。

?Torch?是Facebook用的卷積神經(jīng)網(wǎng)絡(luò)框架,其編程語言是?Lua,通過時域卷積的本地接口,使用非常直觀,定義新網(wǎng)絡(luò)層簡單。因巨頭?Facebook?的人工智能研究所用的框架是?Torch,并且在被谷歌收購之前?DeepMind?也是用的?Torch(收購之后?DeepMind?轉(zhuǎn)向了?TensorFlow)。在目前深度學習編程語言絕大部分以?Python?實現(xiàn)為主的大趨勢下,一個以?Lua?為編程語言的框架的最大劣勢莫過于此。毫無疑問,如果想使用?Torch?這個工具,需要先學習?Lua?語言然后才能使用?Torch,這固然是一個合理的過程。個人更偏向于用?Python、Matlab?或者?C++的實現(xiàn)。

?Torch支持大量的機器學習算法,同時以GPU上的計算優(yōu)先。

3.2?Torch介紹。

  首先,官方網(wǎng)址:http://torch.ch/?以及GitHub:github.com/torch/torch7

  Torch的目標是讓設(shè)計科學計算算法變得便捷,它包含了大量的機器學習、計算機視覺、信號處理、并行運算、圖像、視頻、音頻、網(wǎng)絡(luò)處理的庫,同時和Caffe類似,Torch擁有大量的訓練好的深度學習模型。它可以支持設(shè)計非常復雜的神經(jīng)網(wǎng)絡(luò)的拓撲圖結(jié)構(gòu),再并行化到CPU和GPU上,在Torch上設(shè)計新的Layer是相對簡單的。它和TensorFlow一樣使用了底層C++加上層腳本語言調(diào)用的方式,只不過Torch使用的是Lua。Lua的性能是非常優(yōu)秀的(該語言經(jīng)常被用來開發(fā)游戲),常見的代碼可以通過透明的JIT優(yōu)化達到C的性能的80%;在便利性上,Lua的語法也非常簡單易讀,擁有漂亮和統(tǒng)一的結(jié)構(gòu),易于掌握,比寫C/C++簡潔很多;同時,Lua擁有一個非常直接的調(diào)用C程序的接口,可以簡便地使用大量基于C的庫,因為底層核心是C寫的,因此也可以方便地移植到各種環(huán)境。Lua支持Linux、Mac,還支持各種嵌入式系統(tǒng)(iOS、Android、FPGA等),只不過運行時還是必須有LuaJIT的環(huán)境,所以工業(yè)生產(chǎn)環(huán)境的使用相對較少,沒有Caffe和TensorFlow那么多。為什么不簡單地使用Python而是使用LuaJIT呢?官方給出了以下幾點理由:LuaJIT的通用計算性能遠勝于Python,而且可以直接在LuaJIT中操作C的pointers;Torch的框架,包含Lua是自洽的,而完全基于Python的程序?qū)Σ煌脚_、系統(tǒng)移植性較差,依賴的外部庫較多;LuaJIT的FFI拓展接口非常易學,可以方便地鏈接其他庫到Torch中。

  Torch中還專門設(shè)計了N-Dimension?array?type的對象Tensor,Torch中的Tensor是一塊內(nèi)存的視圖,同時一塊內(nèi)存可能有許多視圖(Tensor)指向它,這樣的設(shè)計同時兼顧了性能(直接面向內(nèi)存)和便利性。同時,Torch還提供了不少相關(guān)的庫,包括線性代數(shù)、卷積、傅里葉變換、Torch的nn庫支持神經(jīng)網(wǎng)絡(luò)、自編碼器、線性回歸、卷積網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)等,同時支持定制的損失函數(shù)及梯度計算。Torch因為使用了LuaJIT,因此用戶在Lua中做數(shù)據(jù)預處理等操作可以隨意使用循環(huán)等操作,而不必像在Python中那樣擔心性能問題,也不需要學習Python中各種加速運算的庫。不過,Lua相比Python還不是那么主流,對大多數(shù)用戶有學習成本。Torch在CPU上的計算會使用OpenMP、SSE進行優(yōu)化,GPU上使用CUDA、cutorch、cunn、cuDNN進行優(yōu)化,同時還有cuda-convnet的wrapper。Torch有很多第三方的擴展可以支持RNN,使得Torch基本支持所有主流的網(wǎng)絡(luò)。和Caffe類似的是,Torch也是主要基于Layer的連接來定義網(wǎng)絡(luò)的。Torch中新的Layer依然需要用戶自己實現(xiàn),不過定義新Layer和定義網(wǎng)絡(luò)的方式很相似,非常簡便,不像Caffe那么麻煩,用戶需要使用C++或者CUDA定義新Layer。同時,Torch屬于命令式編程模式,不像Theano、TensorFlow屬于聲明性編程(計算圖是預定義的靜態(tài)的結(jié)構(gòu)),所以用它實現(xiàn)某些復雜操作(比如beam?search)比Theano和TensorFlow方便很多。

  PyTorch是Torch計算引擎的python前端,不僅能夠提供Torch的高性能,還能夠?qū)PU的提供更好支持。該框架的開發(fā)者表示,PyTorch與Torch的區(qū)別在于它不僅僅是封裝,而是進行了深度集成的框架,這使得PyTorc在網(wǎng)絡(luò)構(gòu)建方面具有更高的靈活性。(如下圖)。

?

?

四、Theano?

4.1?Theano簡述。

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

  Theano是使用符號邏輯創(chuàng)建網(wǎng)絡(luò)的框架,是以Python編寫的,但利用了numpy的高效代碼庫,從而提高了性能,超過了標準的Python。Theano在構(gòu)建網(wǎng)絡(luò)方面有很大的優(yōu)勢,但是在創(chuàng)造完整的解決方案中則具有比較大的挑戰(zhàn)。Theano將機器學習中使用的梯度計算作為網(wǎng)絡(luò)創(chuàng)建的“免費”副產(chǎn)品,對于那些希望更多地關(guān)注網(wǎng)絡(luò)架構(gòu)而不是梯度計算的人來說,這可能是有用的。此外,它的文本文件質(zhì)量也相當不錯。

  但需要提醒大家的一點是,Theano目前已停止更新。

4.2?Theano介紹。

  首先,官方網(wǎng)址:官方網(wǎng)址:http://www.deeplearning.net/software/theano/??及其GitHub:github.com/Theano/Theano。

  Theano作為一個誕生比Caffe早的框架,在早期Theano是深度學習領(lǐng)域最流行的軟件包。嚴格來說,Theano不是專門面向深度學習的,而是一個基于多維數(shù)組用于計算和優(yōu)化數(shù)學表達式的數(shù)值軟件包,因為神經(jīng)網(wǎng)絡(luò)的本質(zhì)其實就是數(shù)學表達式,所以用Theano可以非常靈活地從無到有地實現(xiàn)神經(jīng)網(wǎng)絡(luò)的各種功能。Theano基于Python,最大的優(yōu)點是靈活,性能非常出色,缺點是基于函數(shù)式的編程方式,還有拗口的API,異常困難的調(diào)試等,造就了陡峭的學習曲線。另外,其異常慢的編譯速度也常常遭人詬病。

  直接在Theano中開發(fā)雖然靈活度最高,但開發(fā)工作量和難度也不小,所以在Theano基礎(chǔ)上有很多封裝過后框架,比如MILA官方的Pylearn2,還有第三方開發(fā)的Lasagne和Keras等。Pylearn2由于把Theano的缺點又進一步發(fā)揮到了極致,在火了一小陣后就被漸漸冷落,如今已經(jīng)停止了實際意義上的開發(fā)。后兩個框架正在蓬勃發(fā)展中,尤其是Keras,漸漸開始成為一個脫離底層實現(xiàn)的大框架,目前除了Theano也支持了Google的Tensorflow。

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

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

  Theano在單GPU上執(zhí)行效率不錯,性能和其他框架類似。但是運算時需要將用戶的Python代碼轉(zhuǎn)換成CUDA代碼,再編譯為二進制可執(zhí)行文件,編譯復雜模型的時間非常久。此外,Theano在導入時也比較慢,而且一旦設(shè)定了選擇某塊GPU,就無法切換到其他設(shè)備。目前,Theano在CUDA和cuDNN上不支持多GPU,只在OpenCL和Theano自己的gpuarray庫上支持多GPU訓練,速度暫時還比不上CUDA的版本,并且Theano目前還沒有分布式的實現(xiàn)。不過,Theano在訓練簡單網(wǎng)絡(luò)(比如很淺的MLP)時性能可能比TensorFlow好,因為全部代碼都是運行時編譯,不需要像TensorFlow那樣每次feed?mini-batch數(shù)據(jù)時都得通過低效的Python循環(huán)來實現(xiàn)。

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

?

五、Keras?

5.1?Keras?簡述。

  Keras它的句法是相當明晰的,文檔也非常好(盡管相對較新),而且它支持Python語言。它的使用非常簡單輕松;我們也能很直觀地了解它的指令、函數(shù)和每個模塊之間的鏈接方式。?Keras是一個非常高層的庫,可以工作在?Theano?和?TensorFlow(可以配置)之上。另外,Keras強調(diào)極簡主義——你只需幾行代碼就能構(gòu)建一個神經(jīng)網(wǎng)絡(luò)。在這里你可以比較一下?Keras和TensorFlow?實現(xiàn)相同功能時所需的代碼。

?

5.2?Keras?介紹。

  官方網(wǎng)址:keras.io??及其GitHub:github.com/fchollet/keras

  Keras是用Python編寫的框架,可以作為Theano或Tensorflow的后端。這使得Keras在構(gòu)建完整的解決方案中更容易,而且因為每一行代碼都創(chuàng)建了一個網(wǎng)絡(luò)層,所以它也更易于閱讀。此外,Keras還擁有最先進算法(優(yōu)化器(optimizers)、歸一化例程(normalization?routines)、激活函數(shù)(activation?functions))的最佳選擇。

需說明:雖然Keras支持Theano和Tensorflow后端,但輸入數(shù)據(jù)的維度假設(shè)是不同的,因此需仔細的設(shè)計才能使代碼支持兩個后端工作。該項目有完備的文本文件,并提供了一系列針對各種問題的實例以及訓練好了的、用于傳輸學習實現(xiàn)常用體系的結(jié)構(gòu)模型。在編寫的時候,有消息宣稱Tensorflow將采用Keras作為首選的高級包。其實,這并不奇怪,因為Keras的開發(fā)者Francois?Chollet本身就是谷歌的軟件工程師。

  Keras是一個崇尚極簡、高度模塊化的神經(jīng)網(wǎng)絡(luò)庫,使用Python實現(xiàn),并可以同時運行在TensorFlow和Theano上。它旨在讓用戶進行最快速的原型實驗,讓想法變?yōu)榻Y(jié)果的這個過程最短。Theano和TensorFlow的計算圖支持更通用的計算,而Keras則專精于深度學習。Theano和TensorFlow更像是深度學習領(lǐng)域的NumPy,而Keras則是這個領(lǐng)域的Scikit-learn。它提供了目前為止最方便的API,用戶只需要將高級的模塊拼在一起,就可以設(shè)計神經(jīng)網(wǎng)絡(luò),它大大降低了編程開銷(code?overhead)和閱讀別人代碼時的理解開銷(cognitive?overhead)。它同時支持卷積網(wǎng)絡(luò)和循環(huán)網(wǎng)絡(luò),支持級聯(lián)的模型或任意的圖結(jié)構(gòu)的模型(可以讓某些數(shù)據(jù)跳過某些Layer和后面的Layer對接,使得創(chuàng)建Inception等復雜網(wǎng)絡(luò)變得容易),從CPU上計算切換到GPU加速無須任何代碼的改動。因為底層使用Theano或TensorFlow,用Keras訓練模型相比于前兩者基本沒有什么性能損耗(還可以享受前兩者持續(xù)開發(fā)帶來的性能提升),只是簡化了編程的復雜度,節(jié)約了嘗試新網(wǎng)絡(luò)結(jié)構(gòu)的時間。可以說模型越復雜,使用Keras的收益就越大,尤其是在高度依賴權(quán)值共享、多模型組合、多任務(wù)學習等模型上,Keras表現(xiàn)得非常突出。Keras所有的模塊都是簡潔、易懂、完全可配置、可隨意插拔的,并且基本上沒有任何使用限制,神經(jīng)網(wǎng)絡(luò)、損失函數(shù)、優(yōu)化器、初始化方法、激活函數(shù)和正則化等模塊都是可以自由組合的。Keras也包括絕大部分state-of-the-art的Trick,包括Adam、RMSProp、Batch?Normalization、PReLU、ELU、LeakyReLU等。同時,新的模塊也很容易添加,這讓Keras非常適合最前沿的研究。Keras中的模型也都是在Python中定義的,不像Caffe、CNTK等需要額外的文件來定義模型,這樣就可以通過編程的方式調(diào)試模型結(jié)構(gòu)和各種超參數(shù)。在Keras中,只需要幾行代碼就能實現(xiàn)一個MLP,或者十幾行代碼實現(xiàn)一個AlexNet,這在其他深度學習框架中基本是不可能完成的任務(wù)。Keras最大的問題可能是目前無法直接使用多GPU,所以對大規(guī)模的數(shù)據(jù)處理速度沒有其他支持多GPU和分布式的框架快。Keras的編程模型設(shè)計和Torch很像,但是相比Torch,Keras構(gòu)建在Python上,有一套完整的科學計算工具鏈,而Torch的編程語言Lua并沒有這樣一條科學計算工具鏈。無論從社區(qū)人數(shù),還是活躍度來看,Keras目前的增長速度都已經(jīng)遠遠超過了Torch。

?

六、MXNet

6.1?MXNet簡述。

  MXnet出自CXXNet、Minerva、Purine等項目的開發(fā)者之手,主要用C++編寫。MXNet強調(diào)提高內(nèi)存使用的效率,甚至能在智能手機上運行諸如圖像識別等任務(wù)。它支持大多數(shù)編程語言的框架之一,包括?Python,R,C++,Julia?等。使用?R?語言的開發(fā)者會特別偏愛?mxnet,因為至今為止還是?Python?以不可置疑的態(tài)勢稱霸深度學習語言的。

  MXNet前身是DMLC的CXXNet和Minerva,這兩個項目一個通過配置和定義來訓練網(wǎng)絡(luò),而另一個則提供了類似numpy一樣的多維數(shù)組的用法。MXNet無縫地銜接了這兩種用法,獲得了非常好的靈活性,這是另一個特點。MXNet支持語言非常多,尤其是對R的支持,贏得了一批統(tǒng)計領(lǐng)域的用戶,并且擴展性也不錯,可以說是一個非常有潛力的框架。此外,MXNet還有一個很大的特點是文檔非常“爛”。2016年末,Amazon宣布MXNet為其官方深度學習平臺,并會提供進一步支持,這個問題似乎有望被解決。后續(xù)MXNet是否能進一步崛起,并和TensorFlow還有Caffe一較高下,我們拭目以待。

?

6.2?MXNet介紹。

  官網(wǎng)網(wǎng)址:mxnet.io?以及GitHub:github.com/dmlc/mxnet

  MXNet是DMLC(Distributed?Machine?Learning?Community)開發(fā)的一款開源的、輕量級、可移植的、靈活的深度學習庫,它讓用戶可以混合使用符號編程模式和指令式編程模式來最大化效率和靈活性,目前已經(jīng)是AWS官方推薦的深度學習框架。MXNet的很多作者都是中國人,其最大的貢獻組織為百度,同時很多作者來自cxxnet、minerva和purine2等深度學習項目,可謂博采眾家之長。它是各個框架中率先支持多GPU和分布式的,同時其分布式性能也非常高。MXNet的核心是一個動態(tài)的依賴調(diào)度器,支持自動將計算任務(wù)并行化到多個GPU或分布式集群(支持AWS、Azure、Yarn等)。它上層的計算圖優(yōu)化算法可以讓符號計算執(zhí)行得非常快,而且節(jié)約內(nèi)存,開啟mirror模式會更加省內(nèi)存,甚至可以在某些小內(nèi)存GPU上訓練其他框架因顯存不夠而訓練不了的深度學習模型,也可以在移動設(shè)備(Android、iOS)上運行基于深度學習的圖像識別等任務(wù)。此外,MXNet的一個很大的優(yōu)點是支持非常多的語言封裝,比如C++、Python、R、Julia、Scala、Go、MATLAB和JavaScript等,可謂非常全面,基本主流的腳本語言全部都支持了。在MXNet中構(gòu)建一個網(wǎng)絡(luò)需要的時間可能比Keras、Torch這類高度封裝的框架要長,但是比直接用Theano等要快。MXNet的各級系統(tǒng)架構(gòu)(下面為硬件及操作系統(tǒng)底層,逐層向上為越來越抽象的接口)如圖2-6所示。

  MXNet是DMLC(Distributed?Machine?Learning?Community)開發(fā)的一款開源的、輕量級、可移植的、靈活的深度學習庫,它讓用戶可以混合使用符號編程模式和指令式編程模式來最大化效率和靈活性,目前已經(jīng)是AWS官方推薦的深度學習框架。MXNet的很多作者都是中國人,其最大的貢獻組織為百度,同時很多作者來自cxxnet、minerva和purine2等深度學習項目,可謂博采眾家之長。它是各個框架中率先支持多GPU和分布式的,同時其分布式性能也非常高。MXNet的核心是一個動態(tài)的依賴調(diào)度器,支持自動將計算任務(wù)并行化到多個GPU或分布式集群(支持AWS、Azure、Yarn等)。它上層的計算圖優(yōu)化算法可以讓符號計算執(zhí)行得非常快,而且節(jié)約內(nèi)存,開啟mirror模式會更加省內(nèi)存,甚至可以在某些小內(nèi)存GPU上訓練其他框架因顯存不夠而訓練不了的深度學習模型,也可以在移動設(shè)備(Android、iOS)上運行基于深度學習的圖像識別等任務(wù)。此外,MXNet的一個很大的優(yōu)點是支持非常多的語言封裝,比如C++、Python、R、Julia、Scala、Go、MATLAB和JavaScript等,可謂非常全面,基本主流的腳本語言全部都支持了。在MXNet中構(gòu)建一個網(wǎng)絡(luò)需要的時間可能比Keras、Torch這類高度封裝的框架要長,但是比直接用Theano等要快。MXNet的各級系統(tǒng)架構(gòu)(下面為硬件及操作系統(tǒng)底層,逐層向上為越來越抽象的接口)如圖所示。

?

七、其他深度學習框架

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

7.1?Cuda-convnet2:由2012年讓深度學習在視覺領(lǐng)域聲名大噪的AlexNet作者,辛頓的學生阿歷克斯·克里澤夫斯基(Alex?Krizhevsky)開發(fā)。作為一名學術(shù)工程雙馨的天才,其開發(fā)的cuda-convnet2性能曾經(jīng)非常強悍,不過不知什么原因,最近也停止更新了。

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

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

7.4?CNTK全稱為Computational?Network?Toolkit,是微軟出品的深度學習框架,于2016年初開源,所以目前使用者寥寥。該框架同時支持CPU和GPU,據(jù)說性能極其強悍,在微軟官方博客上的測試中,超過了其他所有常見框架。CNTK是由微軟開發(fā)的框架,并被描述為機器學習的“Visual?Studio”。對于那些使用Visual?Studio進行編程的人,這可能是一種更溫和、更有效的進入深度學習的CNTK(Computational?Network?Toolkit)是微軟研究院(MSR)開源的深度學習框架。它最早由start?the?deep?learning?craze的演講人創(chuàng)建,目前已經(jīng)發(fā)展成一個通用的、跨平臺的深度學習系統(tǒng),在語音識別領(lǐng)域的使用尤其廣泛。CNTK通過一個有向圖將神經(jīng)網(wǎng)絡(luò)描述為一系列的運算操作,這個有向圖中子節(jié)點代表輸入或網(wǎng)絡(luò)參數(shù),其他節(jié)點代表各種矩陣運算。CNTK支持各種前饋網(wǎng)絡(luò),包括MLP、CNN、RNN、LSTM、Sequence-to-Sequence模型等,也支持自動求解梯度。CNTK有豐富的細粒度的神經(jīng)網(wǎng)絡(luò)組件,使得用戶不需要寫底層的C++或CUDA,就能通過組合這些組件設(shè)計新的復雜的Layer。CNTK擁有產(chǎn)品級的代碼質(zhì)量,支持多機、多GPU的分布式訓練。CNTK設(shè)計是性能導向的,在CPU、單GPU、多GPU,以及GPU集群上都有非常優(yōu)異的表現(xiàn)。同時微軟最近推出的1-bit?compression技術(shù)大大降低了通信代價,讓大規(guī)模并行訓練擁有了很高的效率。CNTK同時宣稱擁有很高的靈活度,它和Caffe一樣通過配置文件定義網(wǎng)絡(luò)結(jié)構(gòu),再通過命令行程序執(zhí)行訓練,支持構(gòu)建任意的計算圖,支持AdaGrad、RmsProp等優(yōu)化方法。它的另一個重要特性就是拓展性,CNTK除了內(nèi)置的大量運算核,還允許用戶定義他們自己的計算節(jié)點,支持高度的定制化。CNTK在2016年9月發(fā)布了對強化學習的支持,同時,除了通過寫配置文件的方式定義網(wǎng)絡(luò)結(jié)構(gòu),CNTK還將支持其他語言的綁定,包括Python、C++和C#,這樣用戶就可以用編程的方式設(shè)計網(wǎng)絡(luò)結(jié)構(gòu)。CNTK與Caffe一樣也基于C++并且跨平臺,大部分情況下,它的部署非常簡單。PC上支持Linux、Mac和Windows,但是它目前不支持ARM架構(gòu),限制了其在移動設(shè)備上的發(fā)揮。圖2-7所示為CNTK目前的總體架構(gòu)圖。CNTK原生支持多GPU和分布式,從官網(wǎng)公布的對比評測來看,性能非常不錯。在多GPU方面,CNTK相對于其他的深度學習庫表現(xiàn)得更突出,它實現(xiàn)了1-bit?SGD和自適應(yīng)的mini-batching。圖2-8所示為CNTK官網(wǎng)公布的在2015年12月的各個框架的性能對比。在當時,CNTK是唯一支持單機8塊GPU的框架,并且在分布式系統(tǒng)中可以超越8塊GPU的性能。

Cognitive?Toolkit認知工具包(Cognitive?Toolkit)之前被大家所知的縮略是?CNTK,但是最近又重命名回歸到?Cognitive?Toolkit,很可能是想沾最近微軟認知服務(wù)(Microsoft?Cognitive?services)的光。在公開的基準測試上的表現(xiàn)來看,這個工具似乎很強勁,支持縱向和橫向的推移。?目前為止,Cognitive?Toolkit?似乎不是很流行。我并沒有讀到很多關(guān)于使用這個庫的博客、在線實驗案例或者在?Kaggle?里的相關(guān)評論。但是對我來說,一個背靠微軟研究的框架特別強調(diào)自己的推移能力讓我覺得有些奇怪,畢竟微軟研究團隊可是在語音識別上打破世界紀錄并逼近人類水準。?我在查看他們項目百科的一個范例的時候了解到?Cognitive?Toolkit?在?Python?上的語法和?Keras?是非常相類似的(Cognitive?Toolkit?也支持?C++),這不禁讓我在想(并不是確認)Keras?才是正確的方式。

7.5?Brainstorm來自瑞士人工智能實驗室IDSIA的一個非常發(fā)展前景很不錯的深度學習軟件包,Brainstorm能夠處理上百層的超級深度神經(jīng)網(wǎng)絡(luò)——所謂的公路網(wǎng)絡(luò)Highway?Networks。

7.6?ChainerChainer是由日本公司Preferred?Networks于2015年6月發(fā)布的深度學習框架。Chainer的設(shè)計基于define?by?run原則,也就是說,該網(wǎng)絡(luò)在運行中動態(tài)定義,而不是在啟動時定義,這里有Chainer的詳細文檔。?Chainer與其他框架有點不同,它將網(wǎng)絡(luò)構(gòu)建視為其計算的一部分。它的開發(fā)者介紹說,在這一框架中,大多數(shù)工具都是“定義然后運行”,這意味著你要定義架構(gòu),然后才能運行它。Chainer嘗試構(gòu)建并優(yōu)化其架構(gòu),使其成為學習過程的一部分,或者稱之為“通過運行定義”。

Chainer對自己的特性描述如下:Powerful,支持CUDA計算,只需要幾行代碼就可以使用GPU加速,同時只需少許改動就可以運行在多GPU上。Flexible,支持多種前饋神經(jīng)網(wǎng)絡(luò),包括卷積網(wǎng)絡(luò)、循環(huán)網(wǎng)絡(luò)、遞歸網(wǎng)絡(luò),支持運行中動態(tài)定義的網(wǎng)絡(luò)(Define-by-Run)。Intuitive,前饋計算可以引入Python的各種控制流,同時反向傳播時不受干擾,簡化了調(diào)試錯誤的難度。絕大多數(shù)的深度學習框架是基于“Define-and-Run”的,也就是說,需要首先定義一個網(wǎng)絡(luò),再向網(wǎng)絡(luò)中feed數(shù)據(jù)(mini-batch)。因為網(wǎng)絡(luò)是預先靜態(tài)定義的,所有的控制邏輯都需要以data的形式插入網(wǎng)絡(luò)中,包括像Caffe那樣定義好網(wǎng)絡(luò)結(jié)構(gòu)文件,或者像Theano、Torch、TensorFlow等使用編程語言定義網(wǎng)絡(luò)。而Chainer則相反,網(wǎng)絡(luò)是在實際運行中定義的,Chainer存儲歷史運行的計算結(jié)果,而不是網(wǎng)絡(luò)的結(jié)構(gòu)邏輯,這樣就可以方便地使用Python中的控制流,所以無須其他工作就可以直接在網(wǎng)絡(luò)中使用條件控制和循環(huán)。

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

7.8?ConvNetJS這是斯坦福大學博士生Andrej?Karpathy開發(fā)瀏覽器插件,基于萬能的JavaScript可以在你的游覽器中訓練神經(jīng)網(wǎng)絡(luò)。Karpathy還寫了一個ConvNetJS的入門教程,以及一個簡潔的瀏覽器演示項目。

7.9?DIGITS:?是由英偉達開發(fā)的,一款基于網(wǎng)絡(luò)的深層開發(fā)工具。在很多方面,它像Caffe一樣,能夠使用文本文件而不是編程語言來描述網(wǎng)絡(luò)和參數(shù)。它具有網(wǎng)絡(luò)可視化工具,因此文本文件中的錯誤更容易被識別出來。此外,它還具有用于可視化學習過程的工具,并支持多個GPU。

7.10?DL4JDeeplearning4J(簡稱DL4J)是一個基于Java和Scala的開源的分布式深度學習庫,由Skymind于2014年6月發(fā)布,其核心目標是創(chuàng)建一個即插即用的解決方案原型。埃森哲、雪弗蘭、博斯咨詢和IBM等都是DL4J的客戶。DL4J擁有一個多用途的n-dimensional?array的類,可以方便地對數(shù)據(jù)進行各種操作;擁有多種后端計算核心,用以支持CPU及GPU加速,在圖像識別等訓練任務(wù)上的性能與Caffe相當;可以與Hadoop及Spark自動整合,同時可以方便地在現(xiàn)有集群(包括但不限于AWS,Azure等)上進行擴展,同時DL4J的并行化是根據(jù)集群的節(jié)點和連接自動優(yōu)化,不像其他深度學習庫那樣可能需要用戶手動調(diào)整。DL4J選擇Java作為其主要語言的原因是,目前基于Java的分布式計算、云計算、大數(shù)據(jù)的生態(tài)非常龐大。用戶可能擁有大量的基于Hadoop和Spark的集群,因此在這類集群上搭建深度學習平臺的需求便很容易被DL4J滿足。同時JVM的生態(tài)圈內(nèi)還有數(shù)不勝數(shù)的Library的支持,而DL4J也創(chuàng)建了ND4J,可以說是JVM中的NumPy,支持大規(guī)模的矩陣運算。此外,DL4J還有商業(yè)版的支持,付費用戶在出現(xiàn)問題時可以通過電話咨詢尋求支持。

借用某網(wǎng)友的話“我接觸這一庫,是因為它的?documentation。當時我正在尋找受限玻爾茲曼機、自編碼器,在?DL4J?中找到了這兩個?documentation。里面的文件很清楚,有理論,有代碼案例。我必須得說?DL4J?的?documentation?簡直是藝術(shù)品,其他庫在記錄代碼的時候需要向它學習。DL4J?背后的公司?Skymind?意識到,雖然在深度學習圈內(nèi)?Python?是老大,但大部分程序員起自?Java,所以需要找到一個解決方案。DL4J?兼容?JVM,也適用?Java、Clojure?和?Scala,隨著?Scala?的起起落落,它也被很多有潛力的創(chuàng)業(yè)公司使用,所以我還會繼續(xù)緊追這個庫。?此外,Skymind?的?twitter?賬戶非常活躍,不斷公開最新的科學論文、案例和教程,及其推薦大家關(guān)注。”

7.11?DIGITS?Deep?Learning?GPU?Training?System,不是一個標準的深度學習庫,它可以算是一個Caffe的高級封裝(或者Caffe的Web版培訓系統(tǒng))。因為封裝得非常重,以至于你不需要(也不能)在DIGITS中寫代碼,即可實現(xiàn)一個深度學習的圖片識別模型。在Caffe中,定義模型結(jié)構(gòu)、預處理數(shù)據(jù)、進行訓練并監(jiān)控訓練過程是相對比較煩瑣的,DIGITS把所有這些操作都簡化為在瀏覽器中執(zhí)行。它可以算作Caffe在圖片分類上的一個漂亮的用戶可視化界面(GUI),計算機視覺的研究者或者工程師可以非常方便地設(shè)計深度學習模型、測試準確率,以及調(diào)試各種超參數(shù)。同時使用它也可以生成數(shù)據(jù)和訓練結(jié)果的可視化統(tǒng)計報表,甚至是網(wǎng)絡(luò)的可視化結(jié)構(gòu)圖。訓練好的Caffe模型可以被DIGITS直接使用,上傳圖片到服務(wù)器或者輸入url即可對圖片進行分類。

7.12?Leaf?是一個基于Rust語言的直觀的跨平臺的深度學習乃至機器智能框架,它擁有一個清晰的架構(gòu),除了同屬Autumn?AI的底層計算庫Collenchyma,Leaf沒有其他依賴庫。它易于維護和使用,并且擁有非常高的性能。Leaf自身宣傳的特點是為Hackers定制的,這里的Hackers是指希望用最短的時間和最少的精力實現(xiàn)機器學習算法的技術(shù)極客。它的可移植性非常好,可以運行在CPU、GPU和FPGA等設(shè)備上,可以支持有任何操作系統(tǒng)的PC、服務(wù)器,甚至是沒有操作系統(tǒng)的嵌入式設(shè)備,并且同時支持OpenCL和CUDA。Leaf是Autumn?AI計劃的一個重要組件,后者的目標是讓人工智能算法的效率提高100倍。憑借其優(yōu)秀的設(shè)計,Leaf可以用來創(chuàng)建各種獨立的模塊,比如深度強化學習、可視化監(jiān)控、網(wǎng)絡(luò)部署、自動化預處理和大規(guī)模產(chǎn)品部署等。

Leaf擁有最簡單的API,希望可以最簡化用戶需要掌握的技術(shù)棧。雖然才剛誕生不久,Leaf就已經(jīng)躋身最快的深度學習框架之一了。圖2-9所示為Leaf官網(wǎng)公布的各個框架在單GPU上訓練VGG網(wǎng)絡(luò)的計算時間(越小越好)的對比(這是和早期的TensorFlow對比,最新版的TensorFlow性能已經(jīng)非常好了)。

7.13?DSSTNE(Deep?Scalable?Sparse?Tensor?Network?Engine)是亞馬遜開源的稀疏神經(jīng)網(wǎng)絡(luò)框架,在訓練非常稀疏的數(shù)據(jù)時具有很大的優(yōu)勢。DSSTNE目前只支持全連接的神經(jīng)網(wǎng)絡(luò),不支持卷積網(wǎng)絡(luò)等。和Caffe類似,它也是通過寫一個JSON類型的文件定義模型結(jié)構(gòu),但是支持非常大的Layer(輸入和輸出節(jié)點都非常多);在激活函數(shù)、初始化方式及優(yōu)化器方面基本都支持了state-of-the-art的方法,比較全面;支持大規(guī)模分布式的GPU訓練,不像其他框架一樣主要依賴數(shù)據(jù)并行,DSSTNE支持自動的模型并行(使用數(shù)據(jù)并行需要在訓練速度和模型準確度上做一定的trade-off,模型并行沒有這個問題)。

在處理特征非常多(上億維)的稀疏訓練數(shù)據(jù)時(經(jīng)常在推薦、廣告、自然語言處理任務(wù)中出現(xiàn)),即使一個簡單的3個隱層的MLP(Multi-Layer?Perceptron)也會變成一個有非常多參數(shù)的模型(可能高達上萬億)。以傳統(tǒng)的稠密矩陣的方式訓練方法很難處理這么多的模型參數(shù),更不必提超大規(guī)模的數(shù)據(jù)量,而DSSTNE有整套的針對稀疏數(shù)據(jù)的優(yōu)化,率先實現(xiàn)了對超大稀疏數(shù)據(jù)訓練的支持,同時在性能上做了非常大的改進。

在DSSTNE官方公布的測試中,DSSTNE在MovieLens的稀疏數(shù)據(jù)上,在單M40?GPU上取得了比TensorFlow快14.8倍的性能提升(注意是和老版的TensorFlow比較),如圖2-10所示。一方面是因為DSSTNE對稀疏數(shù)據(jù)的優(yōu)化;另一方面是TensorFlow在數(shù)據(jù)傳輸?shù)紾PU上時花費了大量時間,而DSSTNE則優(yōu)化了數(shù)據(jù)在GPU內(nèi)的保留;同時DSSTNE還擁有自動模型并行功能,而TensorFlow中則需要手動優(yōu)化,沒有自動支持。

八、其他知識拓展認識

8.1計算機語言

  深度學習的框架:編寫框架所使用的計算機語言會影響到它的有效性。盡管許多框架具有綁定機制,允許使用者使用與編寫框架不同的語言訪問框架,但是編寫框架所使用的語言也不可避免地在某種程度上影響后期開發(fā)的語言的靈活性。

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

8.2?教程(Tutorials)和訓練樣本

  框架的文本質(zhì)量、覆蓋范圍以及示例對于有效使用框架至關(guān)重要。高質(zhì)量的文本文件以及待處理的問題的示例將有助于有效解決開發(fā)者的問題。完備的文件也表明該工具已經(jīng)成熟并且在短期內(nèi)不會改變。

  而不同的深度學習框架在教程和訓練樣本的質(zhì)量和數(shù)量的需求方面存在很大的區(qū)別。舉例來說:Theano、TensorFlow、Torch和MXNet由于具有很好的文本化教程(documented?tutorials),所以非常易于理解和實現(xiàn)。另外,我們還發(fā)現(xiàn),不同的框架在GitHub社區(qū)的參與度和活躍度高低不僅可以作為其未來發(fā)展的重要指標,同時也可以用來衡量通過搜索StackOverflow或Git報告事件來檢測和修復bug的速度。值得注意的是,在教程數(shù)量、訓練樣本以及開發(fā)人員和用戶社區(qū)方面,TensorFlow的需求量非常非常大(像是一個800磅重的大猩猩一樣的龐然大物)。

8.3?CNN建模能力

  卷積神經(jīng)網(wǎng)絡(luò)(CNN)是由一組不同的層組成,將初始數(shù)據(jù)量轉(zhuǎn)換成預定義類分數(shù)的輸出分數(shù)。CNN是一種前饋神經(jīng)網(wǎng)絡(luò),它的人工神經(jīng)元可以響應(yīng)一部分覆蓋范圍內(nèi)的周圍單元,對于大型圖像處理有出色表現(xiàn),可用于圖像識別、推薦引擎和自然語言處理。此外,CNN還可以用于回歸分析,如自動駕駛車輛轉(zhuǎn)向角輸出模型等等。CNN建模能力包括幾個功能:定義模型的概率空間、預構(gòu)建層的可用性以及可用于連接這些層的工具和功能。我們看到,Theano、Caffe和MXNet都具有很好的CNN建模功能,這意味著,TensorFlow能夠很容易地在其InceptionV3模型上進行能力構(gòu)建,Torch中包括易于使用的時間卷積集在內(nèi)的優(yōu)秀的CNN資源,都使得這兩種技術(shù)在CNN建模功能上能夠很好地區(qū)分開來。

8.4?RNN建模能力

  有別于CNN,遞歸神經(jīng)網(wǎng)絡(luò)(RNN)可以用于語音識別、時間序列預測、圖像字幕和其他需要處理順序信息的任務(wù)。由于預先構(gòu)建的RNN模型不像CNN那樣多,因此,如果你有一個RNN深度學習項目,那么就必須考慮為特定技術(shù)預先實施和開源何種RNN模型,這是非常重要的。例如,Caffe擁有極少的RNN資源,而微軟的CNTK和Torch則擁有豐富的RNN教程和預置模型。雖然TensorFlow也具有一些RNN資源,但TFLearn和Keras中所包含的RNN示例要比使用TensorFlow多得多。

8.5?架構(gòu)

  為了在特定的框架中創(chuàng)建和訓練新的模型,至關(guān)重要的一點是要有一個易于使用而且是模塊化的前端架構(gòu)。檢測結(jié)果表明,TensorFlow、Torch和MXNet都具有直觀的模塊化架構(gòu),這使得開發(fā)變得簡單并且直觀。相比之下,像Caffe這樣的框架則需要花大量的工作來創(chuàng)建一個新的層。另外,我們還發(fā)現(xiàn)由于TensorBoard?Web?GUI應(yīng)用程序已經(jīng)被包含在內(nèi),TensorFlow在訓練期間和訓練之后會特別容易調(diào)試和監(jiān)控。

8.6?速度

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

?

8.7?多GPU支持

  大多數(shù)深度學習應(yīng)用程序需要大量的浮點運算(FLOP)。例如,百度的DeepSpeech識別模型需要10秒鐘的ExaFLOPs(百萬兆浮點運算)進行訓練。那可是大于10的18次方的計算量!而作為領(lǐng)先的圖形處理單元(GPU)——如英偉達的Pascal?TitanX,每秒可以執(zhí)行11萬億次浮點運算,在一個足夠大的數(shù)據(jù)集上訓練一個新的模型需要一周的時間。為了減少構(gòu)建模型所需的時間,需要多臺機器上的多個GPU。幸運的是,上面列出的大多數(shù)技術(shù)都提供了這種支持,比如,MXNet就具有一個高度優(yōu)化的多GPU引擎。

8.8?Keras兼容性

  Keras是一個用于進行快速深度學習原型設(shè)計的高級庫,是一個讓數(shù)據(jù)科學家能夠自如地應(yīng)用深度學習的工具。Keras目前支持兩個后端——TensorFlow和Theano,并且還將在TensorFlow中獲得正式的支持。

  Matthew?Rubashkin建議,當你要開始一個深度學習項目時,首先要評估好自己團隊的技能和項目需求。舉例來說,對于以Python為中心的團隊的圖像識別應(yīng)用程序,他建議使用TensorFlow,因為其文本文件豐富、性能適宜并且還擁有優(yōu)秀的原型設(shè)計工具。而如果是為了將RNN擴展到具有Lua能力的客戶團隊產(chǎn)品上,他則推薦使用Torch,這是因為它具有卓越的速度和RNN建模能力。

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

?

轉(zhuǎn)載于:https://www.cnblogs.com/carle-09/p/8984938.html

總結(jié)

以上是生活随笔為你收集整理的深度学习的常用框架的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。