一、Caffe
(Convolutional Architecture for Fast Feature Embedding) BVLC
We believe that Caffe is the fastest convnet implementation available. caffe的官網是http://caffe.berkeleyvision.org/。Caffe是一個清晰而高效的深度學習框架,其作者是博士畢業於UC Berkeley的賈揚清,目前在Google工作。
Caffe是純粹的C++/CUDA架構,支持命令行、Python和MATLAB接口;可以在CPU和GPU直接無縫切換:Caffe::set_mode(Caffe::GPU); 在Caffe中圖層需要使用C++定義,而網絡則使用Protobuf定義。Caffe是一個深度卷積神經網絡的學習框架,使用Caffe可以比較方便地進行CNN模型的訓練和測試,精於CV領域。
Caffe作為快速開發和工程應用是非常適合的。caffe官方提供了大量examples,照着examples寫,caffe只要求會寫prototxt就行,它的訓練過程、梯度下降算法等等都實現封裝好了,懂了prototxt的語法了,基本就能自己構造神經網絡了。caffe作為C++語言以及配合了CUDA開發的框架,訓練效率也有保證,這也是caffe適合於工業應用的原因。代碼易懂好理解,高效、實用。上手簡單,使用方便,比較成熟和完善,實現基礎算法方便快捷,開發新算法不是特別靈活,適合工業快速應用實現.
Caffe的優勢:
一方面是調參,改網絡很方便,開源做得很好,另一方面CNN在CV里用的很多,這也是Caffe的優勢。
上手快:配置文件簡單,易上手,文檔齊全,模型與相應優化都是以文本形式而非代碼形式給出。
Caffe給出了模型的定義、最優化設置以及預訓練的權重,方便立即上手。
速度快:Google Protocol Buffer數據標准為Caffe提升了效率,能夠運行最棒的模型與海量的數據。Caffe與cuDNN結合使用,測試AlexNet模型,在K40上處理每張圖片只需要1.17ms.
模塊化:允許對新數據格式、網絡層和損失函數進行擴展,方便擴展到新的任務和設置上。
可以使用Caffe提供的各層類型來定義自己的模型。
開放性:公開的代碼和參考模型用於再現。
社區好:可以通過BSD-2參與開發與討論。
學術論文采用此模型較多。不少論文都與Caffe有關(R-CNN,DSN,最近還有人用Caffe實現LSTM)
缺點:
靈活性差,不同版本接口不兼容, 可定制性較低,不能很方便得擴展到其它模型。
Caffe可能是第一個主流的工業級深度學習工具,它開始於2013年底,具有出色的卷積神經網絡實現。在計算機視覺領域Caffe依然是最流行的工具包,它有很多擴展,但是由於一些遺留的架構問題,它對遞歸網絡和語言建模的支持很差。
二、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的目的是做一個有意思的系統,能夠讓大家用着方便的系統,一個輕量的和可以快速測試系統和算法想法的系統。未來主要關注下面四個方向:
- 支持更多的硬件,目前在積極考慮支持AMD GPU,高通GPU,Intel Phi,FPGA,和更多智能設備。相信MXNet的輕量和內存節省可以在這些上大有作為。
- 更加完善的操作子。目前不論是Symbol還是NDArray支持的操作還是有限,我們希望能夠盡快的擴充他們。
- 更多編程語言。除了C++,目前MXNet對Python,R和Julia的支持比較完善。但我們希望還能有很多的語言,例如javascript。
- 更多的應用。我們之前花了很多精力在圖片分類上,下面我們會考慮很多的應用。
三、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等格式中轉轉換。
四、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.困難的調試方法
五、TensorFlow
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的優點:
1、TensorFlow則是功能很齊全,能夠搭建的網絡更豐富而不是像caffe僅僅局限在CNN。
2、 TensorFlow的深度學習部分能夠在一個模型中堆積了許多不同的模型和轉換,你能夠在一個模型中方便地處理文本 圖片和規則分類以及連續變量,同時實現多目標和多損失工作;
3、TensorFlow的管道部分能夠將數據處理和機器學習放在一個框架中,TensorFlow指引了方向。
TensorFlow是一個理想的RNN(遞歸神經網絡) API和實現,TensorFlow使用了向量運算的符號圖方法,使得新網絡的指定變得相當容易,但TensorFlow並不支持雙向RNN和3D卷積,同時公共版本的圖定義也不支持循環和條件控制,這使得RNN的實現並不理想,因為必須要使用Python循環且無法進行圖編譯優化。
六、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被廣泛應用,包括Pinterest這樣的web大戶。與TensorFlow一樣,Caffe也是由C++開發,Caffe也是Google今年早些時候發布的DeepDream項目(可以識別喵星人的人工智能神經網絡)的基礎。
2008年誕生於蒙特利爾理工學院,Theano派生出了大量深度學習Python軟件包,最著名的包括Blocks和Keras。
Torch誕生已經有十年之久,但是真正起勢得益於去年Facebook開源了大量Torch的深度學習模塊和擴展。Torch另外一個特殊之處是采用了不怎么流行的編程語言Lua(該語言曾被用來開發視頻游戲)。
除了以上三個比較成熟知名的項目,還有很多有特色的深度學習開源框架也值得關注:
來自瑞士人工智能實驗室IDSIA的一個非常發展前景很不錯的深度學習軟件包,Brainstorm能夠處理上百層的超級深度神經網絡——所謂的公路網絡Highway Networks。
來自一個日本的深度學習創業公司Preferred Networks,今年6月發布的一個Python框架。Chainer的設計基於define by run原則,也就是說,該網絡在運行中動態定義,而不是在啟動時定義,這里有Chainer的詳細文檔。
顧名思義,Deeplearning4j是”for Java”的深度學習框架,也是首個商用級別的深度學習開源庫。Deeplearning4j由創業公司Skymind於2014年6月發布,使用 Deeplearning4j的不乏埃森哲、雪弗蘭、博斯咨詢和IBM等明星企業。
DeepLearning4j是一個面向生產環境和商業應用的高成熟度深度學習開源庫,可與Hadoop和Spark集成,即插即用,方便開發者在APP中快速集成深度學習功能,可應用於以下深度學習領域:
人臉/圖像識別
語音搜索
語音轉文字(Speech to text)
垃圾信息過濾(異常偵測)
電商欺詐偵測
是普林斯頓大學視覺工作組新推出的C++框架。該團隊還提供了一個文件用於將Caffe模型轉化成語Marvin兼容的模式。
這是斯坦福大學博士生Andrej Karpathy開發瀏覽器插件,基於萬能的JavaScript可以在你的游覽器中訓練神經網絡。Karpathy還寫了一個ConvNetJS的入門教程,以及一個簡潔的瀏覽器演示項目。
github主頁:https://github.com/karpathy/convnetjs
出自CXXNet、Minerva、Purine等項目的開發者之手,主要用C++編寫。MXNet強調提高內存使用的效率,甚至能在智能手機上運行諸如圖像識別等任務。
由創業公司Nervana Systems於今年五月開源,在某些基准測試中,由Python和Sass開發的Neon的測試成績甚至要優於Caffeine、Torch和谷歌的TensorFlow。
6642: iNaturalist(項目:連接自然)挑戰2017數據集
1707- 06436: 未來的計算機視覺調查--通過對2016年的1600篇論文的調研
6342: ThiNet:一個濾波器級別的調諧方法用於深度網絡壓縮
6292: STag:一個基准的標記系統