http://www.oschina.net/news/80593/deep-learning-frameworks-a-review-before-finishing-2016html
TensorFlow
連接:https://www.tensorflow.org/git
對於那些據說過深度學習但尚未太過專門深刻的人來講,TensorFlow 是他們最喜歡的深度學習框架,但在這裏我要澄清一些事實。程序員
在 TensorFlow 的官網上,它被定義爲「一個用於機器智能的開源軟件庫」,但我以爲應該這麼定義:TensorFlow 是一個使用數據流圖(data flow graphs)進行數值計算的開源軟件庫。在這裏,他們沒有將 TensorFlow 包含在「深度學習框架」範圍內,而是和 Theano 一塊兒被包含在「圖編譯器(graph compilers)」類別中。github
在結束了 Udacity 的 Deep Learning 課程(https://www.udacity.com/course/deep-learning--ud730)以後,個人感受是 TensorFlow 是一個很是好的框架,可是卻很是低層。使用 TensorFlow 須要編寫大量的代碼,你必須一遍又一遍地從新發明輪子。並且我並非惟一一個這麼想的人。Andrej Karpathy 在 Twitter 上就屢次吐過槽:算法
推文:我但願 TensorFlow 能標準化咱們的代碼,但它是低層面的,因此咱們在其上面的層上分道揚鑣了:Slim、PrettyTensor、Keras、TFLearn ...編程
好比:咱們在 OpenAI 使用 TensorFlow,但咱們彷佛都更喜歡其它框架,咱們有些人還寫自定義代碼。嘆後端
幾個月前,我去參加了「Google Experts Summit: TensorFlow, Machine Learning for everyone, with Sergio Guadarrama」。Sergio 是開發 TensorFlow 的一位工程師,但他在會上沒有展現 TensorFlow,而是展現了一個在 TensorFlow 上工做的更高層的庫 tf.contrib:https://www.tensorflow.org/tutorials/tflearn/。個人見解是:他們內部已經意識到若是要讓更多人使用 TensorFlow,他們就須要以更高的抽象水平在其上建立一些層,從而簡化 TensorFlow 的使用。網絡
TensorFlow 支持 Python 和 C++,也容許在 CPU 和 GPU 上的計算分佈,甚至支持使用 gRPC 進行水平擴展。架構
總結:TensorFlow 很是好,但你必須瞭解它好在哪裏。若是你不想什麼事都本身手動去作和從新發明輪子,你可使用更簡單的庫(安利一下 Keras)。框架
Theano
連接:http://deeplearning.net/software/theano/
Theano 是最老牌和最穩定的庫之一。據我所知,深度學習庫的開端不是 Caffe 就是 Theano。
和 TensorFlow 相似,Theano 是一個比較低層的庫。也所以它並不適合深度學習,而更適合數值計算優化。它支持自動的函數梯度計算,帶有 Python 接口並集成了 Numpy,這使得它從一開始就成爲了通用深度學習領域最常使用的庫之一。
今天,Theano 依然效果良好,但因爲它不支持多 GPU 和水平擴展,在 TensorFlow 的熱潮下(它們針對同一個領域),Theano 已然開始被遺忘了。
Keras
「You have just found Keras.」
上面這句話是你打開文檔頁面時看到的第一句話。我還記得我第一次發現 Keras 的時候。那時候我正在柏林解決 Data Science Retreat 的最後一個項目,爲此我努力進入了深度學習庫的世界。我在起步時就已經有了足夠的深度學習知識,但我沒有時間本身手動編寫功能,也沒有時間探索和學習一個新的庫(截止時間不到 2 個月,而我還有課要上)。而後我發現了 Keras。
我真的很喜歡 Keras,由於它的句法是至關明晰的,它的文檔也很是好(儘管相對較新),並且它支持我已經掌握的語言 Python。它的使用很是簡單輕鬆;咱們也能很直觀地瞭解它的指令、函數和每一個模塊之間的連接方式。
Keras 是一個很是高層的庫,能夠工做在 Theano 和 TensorFlow(能夠配置)之上。另外,Keras 強調極簡主義——你只需幾行代碼就能構建一個神經網絡。在這裏你能夠比較一下 Keras 和 TensorFlow 實現相同功能時所需的代碼:https://gist.github.com/ricgu8086/0ba44ce3aab19ec50425383a4d778b50
Lasagne
連接:http://lasagne.readthedocs.io/en/latest/index.html
Lasagne 是一個工做在 Theano 之上的庫。它的使命是簡化一點深度學習算法之下的複雜計算,同時也提供了一個更加友好的接口(也是 Python 的)。這是一個老牌的庫,而且很長時間以來它都是一個擴展能力很強的工具;但在我看來,它的發展速度趕不上 Keras。它們的適用領域都差很少,但 Keras 有更好的文檔、也更完整。
Caffe
連接:http://caffe.berkeleyvision.org/
Caffe 不僅是最老牌的框架之一,而是老牌中的老牌。
在我看來,Caffe 有很是好的特性,但也有一些小缺點。起初的時候它並非一個通用框架,而僅僅關注計算機視覺,但它具備很是好的通用性。在咱們實驗室的實驗中,CaffeNet 架構的訓練時間在 Caffe 中比在 Keras 中(使用了 Theano 後端)少 5 倍。Caffe 的缺點是它不夠靈活。若是你想給它來一點新改變,那你就須要使用 C++ 和 CUDA 編程,不過你也可使用 Python 或 Matlab 接口進行一些小改變。
Caffe 的文檔很是貧乏。你須要花大量時間檢查代碼才能理解它(Xavier 初始化有什麼用?Glorot 是什麼?)
Caffe 的最大缺點之一是它的安裝。它須要解決大量的依賴包……我曾經安裝過 Caffe 兩次,真正痛苦至極。
但要清楚,Caffe 並非一無可取。在投入了生產的計算機視覺系統的工具上,Caffe 是無可爭議的領導者。它很是穩健很是快速。個人建議是:用 Keras 進行實驗和測試,而後遷移到 Caffe 中進行生產。
DSSTNE
連接:https://github.com/amznlabs/amazon-dsstne
DSSTNE 的發音同 Destiny,是一個酷勁十足的框架卻老是被忽略。爲何?除去其餘的因素不談,緣由在於這個框架不具備普適性,不是爲通常常見任務所設計的。DSSTNE 框架只作一件事——推薦系統,但把這件事作到了極致。既不是爲研究而設計,也不是爲測試 idea 而設計(來源其官方網站的宣傳語),DSSTNE 框架是爲量產而設計。
咱們已在 BEEVA 上作一些實驗測試了,目前我已經感受到這是一個運行很是快的工具而且可以獲得很是好的運行結果(平均準確率均值——mAP 很高)。爲了達到這一速度,DSSTNE 框架用 GPU 運行,這也是它的弊端之一:不一樣於篇中分析的其餘框架或者庫,這個框架不支持使用者隨意在 CPU 和 GPU 中切換,而這可能會對有些嘗試有用,但咱們在 DSSTNE 裏作這樣的嘗試時是不被框架所容許的。
其餘的感覺就是迄今爲止 DSSTNE 還不是一個足夠成熟的項目,並且它封裝的太嚴密了(「black box」)。若是咱們想深刻了解這個框架的運行機制是什麼,咱們必須且只能去看它的源碼,而且你須要完成不少必須完成的設置(「TODO」)才能夠看到。同時,關於這個框架的在線教程很少,而能讓開發者進行操做嘗試的指導就更少了。個人意見是再等 4 個月看看 DSSTNE 的最新版本。不能不說 DSSTEN 的確是一個頗有意思的項目但還須要一點成長空間。
還想說明一點,這個框架對編程能力沒有要求。DSSTNE 框架經過其終端的命令行來執行相關操做。
到目前爲止,不少我知道也很流行的框架和庫我尚未用過,我不能給出更多具體的細節。
Torch
在這個世界上天天仍有不少戰爭,可是一個優秀的「勇士」(西班牙語「Guerrero」)必須熟知哪些戰爭是須要去參加做戰的,哪些是能夠選擇不參與的。
Torch 是一個很著名的框架,因巨頭 Facebook 的人工智能研究所用的框架是 Torch,而且在被谷歌收購以前 DeepMind 也是用的 Torch(收購以後 DeepMind 轉向了 TensorFlow)。Torch 的編程語言是 Lua,這就是我剛纔所談的「戰爭」的具體所指。在目前深度學習編程語言絕大部分以 Python 實現爲主的大趨勢下,一個以 Lua 爲編程語言的框架的最大劣勢莫過於此。我從未用使用過這個語言,若是我想使用 Torch 這個工具,毫無疑問我須要先學習 Lua 語言而後才能使用 Torch。這當然是一個合理的過程,但就我我的狀況來講,我偏向於用 Python、Matlab 或者 C++的實現。
MXNet
連接:https://github.com/dmlc/mxnet
mxnet 是一個支持大多數編程語言的框架之一,包括 Python,R,C++,Julia 等。但我以爲使用 R 語言的開發者會特別偏心 mxnet,由於至今爲止仍是 Python 以不可置疑的態勢稱霸深度學習語言的(Python 與 R 的對決,猜猜我會站哪邊?:-p)
老實說,在此以前我並無很關注 mxnet。可是當亞馬遜 AWS 宣佈選擇 mxnet 做爲其深度學習 AMI 的庫時觸發我開始關注 mxnet。我必須去了解一下。後來我獲知亞馬遜把 mxnet 列爲其深度學習的參考庫並宣稱其巨大的橫向擴展能力。我感受到這裏面有一些新的改變發生並且我必須深刻了解。這也是爲何咱們 2017 的 BEEVA 的技術測試名單裏有 mnxet 的緣由。
我對多 GPU 的擴展能力有點疑慮而且我很原意去了解這樣實驗的更多細節,但目前我仍是對 mxnet 持懷疑態度。
DL4J
連接:https://deeplearning4j.org/
我接觸這一庫,是由於它的 documentation。當時我正在尋找受限玻爾茲曼機、自編碼器,在 DL4J 中找到了這兩個 documentation。裏面的文件很清楚,有理論,有代碼案例。我必須得說 DL4J 的 documentation 簡直是藝術品,其餘庫在記錄代碼的時候須要向它學習。
DL4J 背後的公司 Skymind 意識到,雖然在深度學習圈內 Python 是老大,但大部分程序員起自 Java,因此須要找到一個解決方案。DL4J 兼容 JVM,也適用 Java、Clojure 和 Scala,隨着 Scala 的起起落落,它也被不少有潛力的創業公司使用,因此我還會繼續緊追這個庫。
此外,Skymind 的 twitter 帳戶很是活躍,不斷公開最新的科學論文、案例和教程,及其推薦你們關注。
Cognitive Toolkit
連接:https://github.com/Microsoft/CNTK
認知工具包(Cognitive Toolkit)以前被你們所知的縮略是 CNTK,可是最近又重命名迴歸到 Cognitive Toolkit,極可能是想沾最近微軟認知服務(Microsoft Cognitive services)的光。在公開的基準測試上的表現來看,這個工具彷佛很強勁,支持縱向和橫向的推移。
目前爲止,Cognitive Toolkit 彷佛不是很流行。我並無讀到不少關於使用這個庫的博客、在線實驗案例或者在 Kaggle 裏的相關評論。可是對我來講,一個背靠微軟研究的框架特別強調本身的推移能力讓我以爲有些奇怪,畢竟微軟研究團隊但是在語音識別上打破世界紀錄並逼近人類水準。
我在查看他們項目百科的一個範例的時候瞭解到 Cognitive Toolkit 在 Python 上的語法和 Keras 是很是相相似的(Cognitive Toolkit 也支持 C++),這不由讓我在想(並非確認)Keras 纔是正確的方式。
結論
個人結論是:若是你想進入這一領域,你應該首先學習 Python。儘管這一領域還支持其它不少語言,但 Python 是應用範圍最廣並且最簡單的一個。可是爲何要選擇 Python 呢——畢竟 Python 速度這麼慢?由於大多數的庫都使用的是符號式語言(symbolic language)方法而非命令式語言(imperative language)方法。解釋一下也就是說:不是一條接一條地執行你的指令,而是根據你給出的全部指令建立一個計算圖(computing graph)。這個圖被內部優化和編譯成可執行的 C++ 代碼。這樣你就能同時利用上兩個世界的最優之處:Python 帶來的開發速度和 C++ 帶來的執行速度。
人們對深度學習的興趣愈來愈大了,但人們並不肯意等待算法訓練所需的大量計算時間(並且我說的是 GPU,想都不要想只使用 CPU)。這也是多 GPU 支持、多機器上的水平擴展甚至定製硬件最近開始得勢的緣由。
深度學習領域很是活躍、易變。極可能我如今所說的在 2017 年的中旬就變了。
個人建議是,若是你是初學者,使用 Keras,若是不是初學者,也可使用它。若是你參加過 Kaggle 比賽,你確定注意到了 Kaggle 的兩大巨星:Keras 和 XGBoost。
編譯:機器之心