主流開源深度學習框架對比分析

 

1、Caffejavascript

(Convolutional Architecture for Fast Feature Embedding) BVLChtml

  We believe that Caffe is the fastest convnet implementation available. caffe的官網是http://caffe.berkeleyvision.org/。Caffe是一個清晰而高效的深度學習框架,其做者是博士畢業於UC Berkeley的賈揚清,目前在Google工做。java

  Caffe是純粹的C++/CUDA架構,支持命令行、Python和MATLAB接口;能夠在CPU和GPU直接無縫切換:Caffe::set_mode(Caffe::GPU); 在Caffe中圖層須要使用C++定義,而網絡則使用Protobuf定義。Caffe是一個深度卷積神經網絡的學習框架,使用Caffe能夠比較方便地進行CNN模型的訓練和測試,精於CV領域。python

  Caffe做爲快速開發和工程應用是很是適合的。caffe官方提供了大量examples,照着examples寫,caffe只要求會寫prototxt就行,它的訓練過程、梯度降低算法等等都實現封裝好了,懂了prototxt的語法了,基本就能本身構造神經網絡了。caffe做爲C++語言以及配合了CUDA開發的框架,訓練效率也有保證,這也是caffe適合於工業應用的緣由。代碼易懂好理解,高效、實用。上手簡單,使用方便,比較成熟和完善,實現基礎算法方便快捷,開發新算法不是特別靈活,適合工業快速應用實現.git

Caffe的優點:github

一方面是調參,改網絡很方便,開源作得很好,另外一方面CNN在CV裏用的不少,這也是Caffe的優點。web

上手快:配置文件簡單,易上手,文檔齊全,模型與相應優化都是以文本形式而非代碼形式給出。算法

Caffe給出了模型的定義、最優化設置以及預訓練的權重,方便當即上手。編程

速度快:Google Protocol Buffer數據標準爲Caffe提高了效率,可以運行最棒的模型與海量的數據。Caffe與cuDNN結合使用,測試AlexNet模型,在K40上處理每張圖片只須要1.17ms.數組

模塊化:容許對新數據格式、網絡層和損失函數進行擴展,方便擴展到新的任務和設置上。

可使用Caffe提供的各層類型來定義本身的模型。

開放性:公開的代碼和參考模型用於再現。

社區好:能夠經過BSD-2參與開發與討論。

  學術論文采用此模型較多。很多論文都與Caffe有關(R-CNN,DSN,最近還有人用Caffe實現LSTM)

缺點:

靈活性差,不一樣版本接口不兼容, 可定製性較低,不能很方便得擴展到其它模型。

  Caffe多是第一個主流的工業級深度學習工具,它開始於2013年末,具備出色的卷積神經網絡實現。在計算機視覺領域Caffe依然是最流行的工具包,它有不少擴展,可是因爲一些遺留的架構問題,它對遞歸網絡和語言建模的支持不好。

2、MXNet

百度 DMLC(分佈式機器學習社區) 簡稱"深盟"

內存優化作得好

  MXNet結合命令式和聲明式編程的優勢,既能夠對系統作大量的優化,又能夠方便調試。資源和計算的調度、內存分配資源管理、數據的表示、計算優化等都很值得學習的,原生支持分佈式訓練的。

  對於一個優秀的深度學習系統,或者更廣來講優秀的科學計算系統,最重要的是編程接口的設計。他們都採用將一個領域特定語言(domain specific language)嵌入到一個主語言中。例如numpy將矩陣運算嵌入到python中。這類嵌入通常分爲兩種,其中一種嵌入的較淺,其中每一個語句都按原來的意思執行,且一般採用命令式編程(imperative programming),其中numpy和Torch就是屬於這種。而另外一種則用一種深的嵌入方式,提供一整套針對具體應用的迷你語言。這一種一般使用聲明式語言(declarative programing),既用戶只須要聲明要作什麼,而具體執行則由系統完成。這類系統包括Caffe,theano和TensorFlow。

這兩種方式各有利弊,總結以下。

命令式編程:

如何執行 a=b+1: 須要b已經被賦值。當即執行加法,將結果保存在a中。

優勢: 語義上容易理解,靈活,能夠精確控制行爲。一般能夠無縫地和主語言交互,方便地利用主語言的各種算法,工具包,debug和性能調試器。

缺點: 實現統一的輔助函數和提供總體優化都很困難。

聲明式編程:

如何執行 a=b+1: 返回對應的計算圖(computation graph),咱們能夠以後對b進行賦值,而後再執行加法運算

優勢: 在真正開始計算的時候已經拿到了整個計算圖,因此咱們能夠作一系列優化來提高性能。實現輔助函數也容易,例如對任何計算圖都提供forward和backward函數,對計算圖進行可視化,將圖保存到硬盤和從硬盤讀取。

缺點: 不少主語言的特性都用不上。某些在主語言中實現簡單,但在這裏卻常常麻煩,例如if-else語句 。debug也不容易,例如監視一個複雜的計算圖中的某個節點的中間結果並不簡單。

  目前現有的系統大部分都採用上兩種編程模式的一種。與它們不一樣的是,MXNet嘗試將兩種模式無縫的結合起來。在命令式編程上MXNet提供張量運算,而聲明式編程中MXNet支持符號表達式。用戶能夠自由的混合它們來快速實現本身的想法。例如咱們能夠用聲明式編程來描述神經網絡,並利用系統提供的自動求導來訓練模型。另外一方便,模型的迭代訓練和更新模型法則中可能涉及大量的控制邏輯,所以咱們能夠用命令式編程來實現。同時咱們用它來進行方便地調式和與主語言交互數據。

下表咱們比較MXNet和其餘流行的深度學習系統

框架         Caffe                    Torch                          Theano               TensorFlow                   MXNet

主語言     C++                        Lua                           Python                C++                                C++

從語言     Python, Matlab        x                              x                         Python                            Python, R, Julia, Scala, Javascript, Matlab, Go

硬件         CPU, GPU,        CPU, GPU, FPGA       CPU, GPU,         CPU, GPU, mobile         CPU, GPU,mobile

分佈式     x                             x                               x                          v                                      v

命令式     x                             v                               v                          x                                      v

聲明式     v                             x                               x                          v                                      v

Symbol: 聲明式的符號表達式

  MXNet使用多值輸出的符號表達式來聲明計算圖。符號是由操做子構建而來。一個操做子能夠是一個簡單的矩陣運算「+」,也能夠是一個複雜的神經網絡裏面的層,例如卷積層。一個操做子能夠有多個輸入變量和多個輸出變量,還能夠有內部狀態變量。一個變量既能夠是自由的,咱們能夠以後對其賦值;也能夠是某個操做子的輸出。在執行一個符號表達式前,咱們須要對全部的自由變量進行賦值。

NDArray:命令式的張量計算

  MXNet提供命令式的張量計算來橋接主語言的和符號表達式。另外一方面,NDArray能夠無縫和符號表達式進行對接。

KVStore:多設備間的數據交互

  MXNet提供一個分佈式的key-value存儲來進行數據交換。它主要有兩個函數,push: 將key-value對從一個設備push進存儲,pull:將某個key上的值從存儲中pull出來此外,KVStore還接受自定義的更新函數來控制收到的值如何寫入到存儲中。最後KVStore提供數種包含最終一致性模型和順序一致性模型在內的數據一致性模型。

讀入數據模塊

  數據讀取在總體系統性能上佔重要地位。MXNet提供工具能將任意大小的樣本壓縮打包成單個或者數個文件來加速順序和隨機讀取。

訓練模塊

  MXNet實現了經常使用的優化算法來訓練模型。用戶只須要提供數據數據迭代器和神經網絡的Symbol即可。此外,用戶能夠提供額外的KVStore來進行分佈式的訓練。

過去,現狀,和將來

  大半年數個優秀的C++機器學習系統的開發人員成立了DMLC,本意是更方便共享各自項目的代碼,並給用戶提供一致的體驗。當時咱們有兩個深度學習的項目,一個是CXXNet,其經過配置來定義和訓練神經網絡。另外一個是Minerva,提供相似numpy同樣的張量計算接口。前者在圖片分類等使用卷積網絡上很方便,然後者更靈活。那時候咱們想能不能作一個二者功能都具有的系統,因而這樣就有了MXNet。其名字來自Minerva的M和CXXNet的XNet。其中Symbol的想法來自CXXNet,而NDArray的想法來自Minerva。咱們也常把MXNet叫「mix net」。

  MXNet的目的是作一個有意思的系統,可以讓你們用着方便的系統,一個輕量的和能夠快速測試系統和算法想法的系統。將來主要關注下面四個方向:

  1. 支持更多的硬件,目前在積極考慮支持AMD GPU,高通GPU,Intel Phi,FPGA,和更多智能設備。相信MXNet的輕量和內存節省能夠在這些上大有做爲。
  2. 更加完善的操做子。目前不管是Symbol仍是NDArray支持的操做仍是有限,咱們但願可以儘快的擴充他們。
  3. 更多編程語言。除了C++,目前MXNet對Python,R和Julia的支持比較完善。但咱們但願還能有不少的語言,例如javascript。
  4. 更多的應用。咱們以前花了不少精力在圖片分類上,下面咱們會考慮不少的應用。

3、Torch       Facebook  Google DeepMind  Twitter  FAIR

  核心的計算單元使用C或者cuda作了很好的優化。在此基礎之上,使用lua構建了常見的模型。另外,torch7構建的是一個生態系統,安裝新的模型實現模塊只須要luarocks install package. 好比:luarocks install rnn。以後就能夠歡樂地使用rnn模型了。torch7的缺點可能就是1. wrapper是lua語言,須要一點時間來學習。2. 優化新的計算單元可能會比較麻煩,backend修改起來會比較麻煩.

  核心特徵的總結:

1. 一個強大的n維數組

2. 不少實現索引,切片,移調transposing的例程

3.驚人的經過LuaJIT的C接口

4.線性代數例程

5.神經網絡,並基於能量的模型

6.數值優化例程

7.快速高效的GPU支持

8.可嵌入,可移植到iOS,Android和FPGA的後臺

優點:

1. 構建模型簡單,一層層搭積木便可。

2. 高度模塊化,一層就是一個模塊,寫新模塊也方便,套用接口就行,用tensor運算沒必要寫cuda也能用GPU。

3. 底層的tensor由C和cuda實現,速度不會比caffe差,甚至某些運算可能更快。

4. 使用GPU方便,把tensor數據送到GPU只要簡單的 "tensor:cuda()"。

5. lua入門快,堪比python。

6. 很重要的一點,nngraph,理論上能夠用nn裏的模塊實現任何DAG構造的網絡,固然也包括RNN、LSTM之類的。

劣勢:

1. 對於很多人來講,lua要新學。

2. 除了deep learning方面,其餘好用的機器學習library較少。

3. 數據文件格式比較麻煩,通常原始數據沒有torch專用的t7格式文件,須要經過mat等格式中轉轉換。

 

4、Theano

     the LISA group at the University of Montreal(蒙特利爾)

  Theano是一個Python庫,用來定義、優化和計算數學表達式,用於高效的解決多維數組的計算問題。

優勢:

集成NumPy-使用numpy.ndarray

使用GPU加速計算-比CPU快140倍(只針對32位float類型)

有效的符號微分-計算一元或多元函數的導數

速度和穩定性優化-好比能計算很小的x的函數log(1+x)的值

動態地生成C代碼-更快地計算

普遍地單元測試和自我驗證-檢測和診斷多種錯誤

靈活性好

缺點:

1.scan 中糟糕參數的傳遞限制,immutable 機制致使 function compile 時候的時間過長。

 2.theano 定義 function 時缺少靈活的多態機制。

3.困難的調試方法

5、TensorFlow

  Google

  TensorFlow是谷歌基於DistBelief進行研發的第二代人工智能學習系統,其命名來源於自己的運行原理。Tensor(張量)意味着N維數組,Flow(流)意味着基於數據流圖的計算,TensorFlow爲張量從圖象的一端流動到另外一端計算過程。TensorFlow是將複雜的數據結構傳輸至人工智能神經網中進行分析和處理過程的系統。

  TensorFlow 表達了高層次的機器學習計算,大幅簡化了第一代系統,而且具有更好的靈活性和可延展性。TensorFlow一大亮點是支持異構設備分佈式計算,它可以在各個平臺上自動運行模型,從電話、單個CPU / GPU到成百上千GPU卡組成的分佈式系統。從目前的文檔看,TensorFlow支持CNN、RNN和LSTM算法,擁有C++/Python編程接口,這都是目前在Image,Speech和NLP最流行的深度神經網絡模型。

  TensorFlow的數據結構tensor,它至關於N維的array或者list,與MXNet相似,都是採用了以python調用的形式展示出來。某個定義好的tensor的數據類型是不變的,可是維數能夠動態改變。用tensor rank和TensorShape來表示它的維數(例如rank爲2能夠當作矩陣,rank爲1能夠當作向量)。tensor是個比較中規中矩的類型。惟一特別的地方在於在TensorFlow構成的網絡中,tensor是惟一可以傳遞的類型,而相似於array、list這種不能當成輸入。

  TensorFlow的網絡實現方式選擇的是符號計算方式,它的程序分爲計算構造階段和執行階段,構造階段是構造出computation graph,computation graph就是包含一系列符號操做Operation和Tensor數據對象的流程圖,跟mxnet的symbol相似,它定義好了如何進行計算(加減乘除等)、數據經過不一樣計算的順序(也就是flow,數據在符號操做之間流動的感受)。可是暫時並不讀取輸入來計算得到輸出,而是由後面的執行階段啓動session的run來執行已經定義好的graph。這樣的方式跟mxnet很類似,應該都是借鑑了theano的想法。其中TensorFlow還引入了Variable類型,它不像mxnet的Variable屬於symbol(tf的operation相似mxnet的symbol),而是一個單獨的類型,主要做用是存儲網絡權重參數,從而可以在運行過程當中動態改變。tf將每個操做抽象成了一個符號Operation,它可以讀取0個或者多個Tensor對象做爲輸入(輸出),操做內容包括基本的數學運算、支持reduce、segment(對tensor中部分進行運算。

TensorFlow的優勢:

一、TensorFlow則是功能很齊全,可以搭建的網絡更豐富而不是像caffe僅僅侷限在CNN。

二、 TensorFlow的深度學習部分可以在一個模型中堆積了許多不一樣的模型和轉換,你可以在一個模型中方便地處理文本 圖片和規則分類以及連續變量,同時實現多目標和多損失工做;

三、TensorFlow的管道部分可以將數據處理和機器學習放在一個框架中,TensorFlow指引了方向。

  TensorFlow是一個理想的RNN(遞歸神經網絡) API和實現,TensorFlow使用了向量運算的符號圖方法,使得新網絡的指定變得至關容易,但TensorFlow並不支持雙向RNN和3D卷積,同時公共版本的圖定義也不支持循環和條件控制,這使得RNN的實現並不理想,由於必需要使用Python循環且沒法進行圖編譯優化。

6、CNTK      微軟深度學習工具包  

  微軟將人工智能成果 CNTK 開源放上 GitHub,稱是運算速度最快的 Toolkit

  是一個統一的深度學習工具包,它將神經網絡描述成在有向圖上的一系列計算步驟。在這個有向圖中,葉子結點表示輸入層或網絡參數,其它的結點表示成在輸入層上的矩陣操做。在CNTK上能夠很容易的實現及結合當今流行的模型,例如前饋神經網絡DNNs, 卷積神經網絡(CNNs), 循環神經網絡 (RNNs/LSTMs)。在實現隨機梯度降低學習時可以自動計算梯度,並且還能經過多個GPUs或服務器實現並行計算。CNTK是微軟在Cortana 數字助理和Skype 翻譯應用中使用的語音識別的系統框架。

  CNTK最大的優勢是能夠並行多個GPU或服務器。微軟首席科學家黃學東說「谷歌公開的TensorFlow並無這個功能」。

  CNTK的另一個優勢是支持Microsoft Windows。可是這個開源工具是用C++寫的。微軟計劃將盡快公開對應的Python和C#版本。

主流開源深度學習框架對比分析

 

 

 

 

十個值得嘗試的開源深度學習框架

 

  本週早些時候開源中國社區公佈了Google開源了TensorFlow(GitHub)消息,此舉在深度學習領域影響巨大,由於Google在人工智能領域的研發成績斐然,有着雄厚的人才儲備,並且Google本身的Gmail和搜索引擎都在使用自行研發的深度學習工具。

 

  無疑,來自Google軍火庫的TensorFlow必然是開源深度學習軟件中的明星產品,登錄GitHub當天就成爲最受關注的項目,當週得到評星數就輕鬆超過1萬個。

  對於但願在應用中整合深度學習功能的開發者來講,GitHub上其實還有不少不錯的開源項目值得關注,首先咱們推薦目前規模人氣最高的TOP3:

 

Caffe

  源自加州伯克利分校的Caffe被普遍應用,包括Pinterest這樣的web大戶。與TensorFlow同樣,Caffe也是由C++開發,Caffe也是Google今年早些時候發佈的DeepDream項目(能夠識別喵星人的人工智能神經網絡)的基礎。

 

Theano

  2008年誕生於蒙特利爾理工學院,Theano派生出了大量深度學習Python軟件包,最著名的包括BlocksKeras

 

Torch

  Torch誕生已經有十年之久,可是真正起勢得益於去年Facebook開源了大量Torch的深度學習模塊和擴展。Torch另一個特殊之處是採用了不怎麼流行的編程語言Lua(該語言曾被用來開發視頻遊戲)。

 

  除了以上三個比較成熟知名的項目,還有不少有特點的深度學習開源框架也值得關注:

Brainstorm

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

 

Chainer

來自一個日本的深度學習創業公司Preferred Networks,今年6月發佈的一個Python框架。Chainer的設計基於define by run原則,也就是說,該網絡在運行中動態定義,而不是在啓動時定義,這裏有Chainer的詳細文檔

 

Deeplearning4j

顧名思義,Deeplearning4j是」for Java」的深度學習框架,也是首個商用級別的深度學習開源庫。Deeplearning4j由創業公司Skymind於2014年6月發佈,使用 Deeplearning4j的不乏埃森哲、雪弗蘭、博斯諮詢和IBM等明星企業。

DeepLearning4j是一個面向生產環境和商業應用的高成熟度深度學習開源庫,可與Hadoop和Spark集成,即插即用,方便開發者在APP中快速集成深度學習功能,可應用於如下深度學習領域:

人臉/圖像識別

語音搜索

語音轉文字(Speech to text)

垃圾信息過濾(異常偵測)

電商欺詐偵測

 

Marvin

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

 

ConvNetJS

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

  github主頁:https://github.com/karpathy/convnetjs

 

MXNet

  出自CXXNet、Minerva、Purine等項目的開發者之手,主要用C++編寫。MXNet強調提升內存使用的效率,甚至能在智能手機上運行諸如圖像識別等任務。

 

Neon

  由創業公司Nervana Systems於今年五月開源,在某些基準測試中,由Python和Sass開發的Neon的測試成績甚至要優於Caffeine、Torch和谷歌的TensorFlow。

 

6642:  iNaturalist(項目:鏈接天然)挑戰2017數據集

1707- 06436:  將來的計算機視覺調查--經過對2016年的1600篇論文的調研

6342: ThiNet:一個濾波器級別的調諧方法用於深度網絡壓縮

6292: STag:一個基準的標記系統 

 

相關文章
相關標籤/搜索