丁香五月天婷婷久久婷婷色综合91|国产传媒自偷自拍|久久影院亚洲精品|国产欧美VA天堂国产美女自慰视屏|免费黄色av网站|婷婷丁香五月激情四射|日韩AV一区二区中文字幕在线观看|亚洲欧美日本性爱|日日噜噜噜夜夜噜噜噜|中文Av日韩一区二区

您正在使用IE低版瀏覽器,為了您的雷峰網(wǎng)賬號(hào)安全和更好的產(chǎn)品體驗(yàn),強(qiáng)烈建議使用更快更安全的瀏覽器
此為臨時(shí)鏈接,僅用于文章預(yù)覽,將在時(shí)失效
人工智能開發(fā)者 正文
發(fā)私信給AI研習(xí)社
發(fā)送

0

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

本文作者: AI研習(xí)社 2017-02-23 18:19
導(dǎo)語:各種開源深度學(xué)習(xí)框架也層出不窮,本文會(huì)對(duì)各個(gè)深度學(xué)習(xí)框架進(jìn)行比較詳細(xì)的介紹。

雷鋒網(wǎng)按:本文作者黃文堅(jiān),PPmoney 大數(shù)據(jù)算法總監(jiān),《 TensorFlow 實(shí)戰(zhàn)》作者。本文節(jié)選自《 TensorFlow 實(shí)戰(zhàn)》第二章。

在下周二(2月28日)雷鋒網(wǎng)硬創(chuàng)公開課欄目將會(huì)推出黃文堅(jiān)老師的公開課《深度學(xué)習(xí)之經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)的技術(shù)淺析》(點(diǎn)擊了解詳情),歡迎大家報(bào)名!

Google 近日發(fā)布了 TensorFlow 1.0 候選版,這第一個(gè)穩(wěn)定版將是深度學(xué)習(xí)框架發(fā)展中的里程碑的一步。自 TensorFlow 于 2015 年底正式開源,距今已有一年多,這期間 TensorFlow 不斷給人以驚喜。在這一年多時(shí)間,TensorFlow 已從初入深度學(xué)習(xí)框架大戰(zhàn)的新星,成為了幾近壟斷的行業(yè)事實(shí)標(biāo)準(zhǔn)。

主流深度學(xué)習(xí)框架對(duì)比

深度學(xué)習(xí)研究的熱潮持續(xù)高漲,各種開源深度學(xué)習(xí)框架也層出不窮,其中包括 TensorFlow、Caffe、Keras、CNTK、Torch7、MXNet、Leaf、Theano、DeepLearning4、Lasagne、Neon 等等。然而 TensorFlow 卻殺出重圍,在關(guān)注度和用戶數(shù)上都占據(jù)絕對(duì)優(yōu)勢(shì),大有一統(tǒng)江湖之勢(shì)。表 2-1 所示為各個(gè)開源框架在GitHub上的數(shù)據(jù)統(tǒng)計(jì)(數(shù)據(jù)統(tǒng)計(jì)于 2017 年 1 月 3 日),可以看到 TensorFlow 在 star 數(shù)量、fork 數(shù)量、contributor 數(shù)量這三個(gè)數(shù)據(jù)上都完勝其他對(duì)手。

究其原因,主要是 Google 在業(yè)界的號(hào)召力確實(shí)強(qiáng)大,之前也有許多成功的開源項(xiàng)目,以及 Google 強(qiáng)大的人工智能研發(fā)水平,都讓大家對(duì) Google 的深度學(xué)習(xí)框架充滿信心,以至于 TensorFlow 在 2015 年 11 月剛開源的第一個(gè)月就積累了 10000+ 的 star 。其次,TensorFlow 確實(shí)在很多方面擁有優(yōu)異的表現(xiàn),比如設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu)的代碼的簡(jiǎn)潔度,分布式深度學(xué)習(xí)算法的執(zhí)行效率,還有部署的便利性,都是其得以勝出的亮點(diǎn)。如果一直關(guān)注著 TensorFlow 的開發(fā)進(jìn)度,就會(huì)發(fā)現(xiàn)基本上每星期 TensorFlow 都會(huì)有1萬行以上的代碼更新,多則數(shù)萬行。產(chǎn)品本身優(yōu)異的質(zhì)量、快速的迭代更新、活躍的社區(qū)和積極的反饋,形成了良性循環(huán),可以想見 TensorFlow 未來將繼續(xù)在各種深度學(xué)習(xí)框架中獨(dú)占鰲頭。

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

表2-1 各個(gè)開源框架在 GitHub 上的數(shù)據(jù)統(tǒng)計(jì)

觀察表2-1還可以發(fā)現(xiàn),Google、Microsoft、Facebook 等巨頭都參與了這場(chǎng)深度學(xué)習(xí)框架大戰(zhàn),此外,還有畢業(yè)于伯克利大學(xué)的賈揚(yáng)清主導(dǎo)開發(fā)的 Caffe,蒙特利爾大學(xué) Lisa Lab 團(tuán)隊(duì)開發(fā)的 Theano,以及其他個(gè)人或商業(yè)組織貢獻(xiàn)的框架。另外,可以看到各大主流框架基本都支持 Python,目前 Python 在科學(xué)計(jì)算和數(shù)據(jù)挖掘領(lǐng)域可以說是獨(dú)領(lǐng)風(fēng)騷。雖然有來自 R、Julia 等語言的競(jìng)爭(zhēng)壓力,但是 Python 的各種庫實(shí)在是太完善了,Web 開發(fā)、數(shù)據(jù)可視化、數(shù)據(jù)預(yù)處理、數(shù)據(jù)庫連接、爬蟲等無所不能,有一個(gè)完美的生態(tài)環(huán)境。僅在數(shù)據(jù)挖據(jù)工具鏈上,Python 就有 NumPy、SciPy、Pandas、Scikit-learn、XGBoost 等組件,做數(shù)據(jù)采集和預(yù)處理都非常方便,并且之后的模型訓(xùn)練階段可以和 TensorFlow 等基于 Python 的深度學(xué)習(xí)框架完美銜接。

表 2-1 和圖 2-1 所示為對(duì)主流的深度學(xué)習(xí)框架 TensorFlow、Caffe、CNTK、Theano、Torch 在各個(gè)維度的評(píng)分,本書 2.2 節(jié)會(huì)對(duì)各個(gè)深度學(xué)習(xí)框架進(jìn)行比較詳細(xì)的介紹。

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

表2-2 主流深度學(xué)習(xí)框架在各個(gè)維度的評(píng)分

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-1 主流深度學(xué)習(xí)框架對(duì)比圖

各深度學(xué)習(xí)框架簡(jiǎn)介

在本節(jié),我們先來看看目前各流行框架的異同,以及各自的特點(diǎn)和優(yōu)勢(shì)。

TensorFlow

TensorFlow 是相對(duì)高階的機(jī)器學(xué)習(xí)庫,用戶可以方便地用它設(shè)計(jì)神經(jīng)網(wǎng)絡(luò)結(jié)構(gòu),而不必為了追求高效率的實(shí)現(xiàn)親自寫 C++或 CUDA 代碼。它和 Theano 一樣都支持自動(dòng)求導(dǎo),用戶不需要再通過反向傳播求解梯度。其核心代碼和 Caffe 一樣是用 C++編寫的,使用 C++簡(jiǎn)化了線上部署的復(fù)雜度,并讓手機(jī)這種內(nèi)存和CPU資源都緊張的設(shè)備可以運(yùn)行復(fù)雜模型(Python 則會(huì)比較消耗資源,并且執(zhí)行效率不高)。除了核心代碼的 C++接口,TensorFlow 還有官方的 Python、Go 和 Java 接口,是通過 SWIG(Simplified Wrapper and Interface Generator)實(shí)現(xiàn)的,這樣用戶就可以在一個(gè)硬件配置較好的機(jī)器中用 Python進(jìn)行實(shí)驗(yàn),并在資源比較緊張的嵌入式環(huán)境或需要低延遲的環(huán)境中用 C++部署模型。SWIG 支持給 C/C++代碼提供各種語言的接口,因此其他腳本語言的接口未來也可以通過 SWIG 方便地添加。不過使用 Python 時(shí)有一個(gè)影響效率的問題是,每一個(gè) mini-batch 要從 Python 中 feed 到網(wǎng)絡(luò)中,這個(gè)過程在 mini-batch 的數(shù)據(jù)量很小或者運(yùn)算時(shí)間很短時(shí),可能會(huì)帶來影響比較大的延遲?,F(xiàn)在 TensorFlow 還有非官方的 Julia、Node.js、R 的接口支持,地址如下。

Julia: http://github.com/malmaud/TensorFlow.jl

Node.js: http://github.com/node-tensorflow/node-tensorflow

R: http://github.com/rstudio/tensorflow

TensorFlow 也有內(nèi)置的 TF.Learn 和 TF.Slim 等上層組件可以幫助快速地設(shè)計(jì)新網(wǎng)絡(luò),并且兼容 Scikit-learn estimator 接口,可以方便地實(shí)現(xiàn) evaluate、grid search、cross validation 等功能。同時(shí) TensorFlow 不只局限于神經(jīng)網(wǎng)絡(luò),其數(shù)據(jù)流式圖支持非常自由的算法表達(dá),當(dāng)然也可以輕松實(shí)現(xiàn)深度學(xué)習(xí)以外的機(jī)器學(xué)習(xí)算法。事實(shí)上,只要可以將計(jì)算表示成計(jì)算圖的形式,就可以使用 TensorFlow 。用戶可以寫內(nèi)層循環(huán)代碼控制計(jì)算圖分支的計(jì)算,TensorFlow 會(huì)自動(dòng)將相關(guān)的分支轉(zhuǎn)為子圖并執(zhí)行迭代運(yùn)算。TensorFlow 也可以將計(jì)算圖中的各個(gè)節(jié)點(diǎn)分配到不同的設(shè)備執(zhí)行,充分利用硬件資源。定義新的節(jié)點(diǎn)只需要寫一個(gè) Python 函數(shù),如果沒有對(duì)應(yīng)的底層運(yùn)算核,那么可能需要寫 C++或者 CUDA 代碼實(shí)現(xiàn)運(yùn)算操作。

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

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

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

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

TensorFlow 在最開始發(fā)布時(shí)只支持單機(jī),而且只支持 CUDA 6.5 和 cuDNN v2,并且沒有官方和其他深度學(xué)習(xí)框架的對(duì)比結(jié)果。在 2015 年年底,許多其他框架做了各種性能對(duì)比評(píng)測(cè),每次 TensorFlow 都會(huì)作為較差的對(duì)照組出現(xiàn)。那個(gè)時(shí)期的 TensorFlow 真的不快,性能上僅和普遍認(rèn)為很慢的 Theano 比肩,在各個(gè)框架中可以算是墊底。但是憑借 Google 強(qiáng)大的開發(fā)實(shí)力,很快支持了新版的 cuDNN (目前支持cuDNN v5.1),在單 GPU 上的性能追上了其他框架。表 2-3 所示為 https://github.com/soumith/convnet-benchmarks 給出的各個(gè)框架在 AlexNet 上單 GPU 的性能評(píng)測(cè)。

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

表2-3 各深度學(xué)習(xí)框架在 AlexNet 上的性能對(duì)比

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

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

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-2 TensorFlow Serving 架構(gòu)

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

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-3 TensorBoard 的 loss 標(biāo)量的可視化

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-4 TensorBoard 的模型結(jié)構(gòu)可視化

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

Caffe

官方網(wǎng)址:http://caffe.berkeleyvision.org/

GitHub:http://github.com/BVLC/caffe

Caffe 全稱為 Convolutional Architecture for Fast Feature Embedding,是一個(gè)被廣泛使用的開源深度學(xué)習(xí)框架(在 TensorFlow 出現(xiàn)之前一直是深度學(xué)習(xí)領(lǐng)域 GitHub star 最多的項(xiàng)目),目前由伯克利視覺學(xué)中心(Berkeley Vision and Learning Center,BVLC)進(jìn)行維護(hù)。Caffe 的創(chuàng)始人是加州大學(xué)伯克利的 Ph.D.賈揚(yáng)清,他同時(shí)也是TensorFlow的作者之一,曾工作于 MSRA、NEC 和 Google Brain,目前就職于 Facebook FAIR 實(shí)驗(yàn)室。Caffe 的主要優(yōu)勢(shì)包括如下幾點(diǎn)。

  • 容易上手,網(wǎng)絡(luò)結(jié)構(gòu)都是以配置文件形式定義,不需要用代碼設(shè)計(jì)網(wǎng)絡(luò)。

  • 訓(xùn)練速度快,能夠訓(xùn)練 state-of-the-art 的模型與大規(guī)模的數(shù)據(jù)。

  • 組件模塊化,可以方便地拓展到新的模型和學(xué)習(xí)任務(wù)上。

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

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

Theano

官方網(wǎng)址:http://www.deeplearning.net/software/theano/

GitHub:http://github.com/Theano/Theano

Theano 誕生于2008年,由蒙特利爾大學(xué) Lisa Lab 團(tuán)隊(duì)開發(fā)并維護(hù),是一個(gè)高性能的符號(hào)計(jì)算及深度學(xué)習(xí)庫。因其出現(xiàn)時(shí)間早,可以算是這類庫的始祖之一,也一度被認(rèn)為是深度學(xué)習(xí)研究和應(yīng)用的重要標(biāo)準(zhǔn)之一。Theano 的核心是一個(gè)數(shù)學(xué)表達(dá)式的編譯器,專門為處理大規(guī)模神經(jīng)網(wǎng)絡(luò)訓(xùn)練的計(jì)算而設(shè)計(jì)。它可以將用戶定義的各種計(jì)算編譯為高效的底層代碼,并鏈接各種可以加速的庫,比如 BLAS、CUDA 等。Theano 允許用戶定義、優(yōu)化和評(píng)估包含多維數(shù)組的數(shù)學(xué)表達(dá)式,它支持將計(jì)算裝載到 GPU (Theano 在 GPU 上性能不錯(cuò),但是 CPU 上較差)。與 Scikit-learn 一樣,Theano 也很好地整合了 NumPy,對(duì) GPU 的透明讓 Theano 可以較為方便地進(jìn)行神經(jīng)網(wǎng)絡(luò)設(shè)計(jì),而不必直接寫 CUDA 代碼。Theano 的主要優(yōu)勢(shì)如下。

  • 集成 NumPy,可以直接使用 NumPy 的 ndarray,API 接口學(xué)習(xí)成本低。

  • 計(jì)算穩(wěn)定性好,比如可以精準(zhǔn)地計(jì)算輸出值很小的函數(shù)(像 log(1+x))。

  • 動(dòng)態(tài)地生成 C 或者 CUDA 代碼,用以編譯成高效的機(jī)器代碼。

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

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

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

Torch

官方網(wǎng)址:http://torch.ch/

GitHub:http://github.com/torch/torch7

Torch 給自己的定位是 LuaJIT 上的一個(gè)高效的科學(xué)計(jì)算庫,支持大量的機(jī)器學(xué)習(xí)算法,同時(shí)以 GPU 上的計(jì)算優(yōu)先。Torch 的歷史非常悠久,但真正得到發(fā)揚(yáng)光大是在 Facebook 開源了其深度學(xué)習(xí)的組件之后,此后包括 Google、Twitter、NYU、IDIAP、Purdue 等組織都大量使用 Torch。Torch 的目標(biāo)是讓設(shè)計(jì)科學(xué)計(jì)算算法變得便捷,它包含了大量的機(jī)器學(xué)習(xí)、計(jì)算機(jī)視覺、信號(hào)處理、并行運(yùn)算、圖像、視頻、音頻、網(wǎng)絡(luò)處理的庫,同時(shí)和 Caffe 類似,Torch 擁有大量的訓(xùn)練好的深度學(xué)習(xí)模型。它可以支持設(shè)計(jì)非常復(fù)雜的神經(jīng)網(wǎng)絡(luò)的拓?fù)鋱D結(jié)構(gòu),再并行化到 CPU 和 GPU 上,在 Torch 上設(shè)計(jì)新的 Layer 是相對(duì)簡(jiǎn)單的。它和 TensorFlow 一樣使用了底層 C++加上層腳本語言調(diào)用的方式,只不過 Torch 使用的是 Lua。Lua 的性能是非常優(yōu)秀的(該語言經(jīng)常被用來開發(fā)游戲),常見的代碼可以通過透明的 JIT 優(yōu)化達(dá)到 C 的性能的80%;在便利性上,Lua 的語法也非常簡(jiǎn)單易讀,擁有漂亮和統(tǒng)一的結(jié)構(gòu),易于掌握,比寫 C/C++簡(jiǎn)潔很多;同時(shí),Lua 擁有一個(gè)非常直接的調(diào)用 C 程序的接口,可以簡(jiǎn)便地使用大量基于 C 的庫,因?yàn)榈讓雍诵氖?C 寫的,因此也可以方便地移植到各種環(huán)境。Lua 支持 Linux、Mac,還支持各種嵌入式系統(tǒng)(iOS、Android、FPGA 等),只不過運(yùn)行時(shí)還是必須有 LuaJIT 的環(huán)境,所以工業(yè)生產(chǎn)環(huán)境的使用相對(duì)較少,沒有 Caffe 和 TensorFlow 那么多。

為什么不簡(jiǎn)單地使用 Python 而是使用 LuaJIT 呢?官方給出了以下幾點(diǎn)理由。

  • LuaJIT 的通用計(jì)算性能遠(yuǎn)勝于 Python,而且可以直接在 LuaJIT 中操作 C 的 pointers。

  • Torch 的框架,包含 Lua 是自洽的,而完全基于 Python 的程序?qū)Σ煌脚_(tái)、系統(tǒng)移植性較差,依賴的外部庫較多。

  • LuaJIT 的 FFI 拓展接口非常易學(xué),可以方便地鏈接其他庫到 Torch 中。Torch 中還專門設(shè)計(jì)了 N-Dimension array type 的對(duì)象 Tensor,Torch 中的 Tensor 是一塊內(nèi)存的視圖,同時(shí)一塊內(nèi)存可能有許多視圖(Tensor)指向它,這樣的設(shè)計(jì)同時(shí)兼顧了性能(直接面向內(nèi)存)和便利性。同時(shí),Torch 還提供了不少相關(guān)的庫,包括線性代數(shù)、卷積、傅里葉變換、繪圖和統(tǒng)計(jì)等,如圖 2-5 所示。

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-5 Torch 提供的各種數(shù)據(jù)處理的庫

Torch 的 nn 庫支持神經(jīng)網(wǎng)絡(luò)、自編碼器、線性回歸、卷積網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)等,同時(shí)支持定制的損失函數(shù)及梯度計(jì)算。Torc h因?yàn)槭褂昧?LuaJIT,因此用戶在 Lua 中做數(shù)據(jù)預(yù)處理等操作可以隨意使用循環(huán)等操作,而不必像在 Python 中那樣擔(dān)心性能問題,也不需要學(xué)習(xí) Python 中各種加速運(yùn)算的庫。不過,Lua 相比 Python 還不是那么主流,對(duì)大多數(shù)用戶有學(xué)習(xí)成本。Torch 在 CPU 上的計(jì)算會(huì)使用 OpenMP、SSE 進(jìn)行優(yōu)化,GPU 上使用 CUDA、cutorch、cunn、cuDNN 進(jìn)行優(yōu)化,同時(shí)還有 cuda-convnet 的 wrapper。Torch 有很多第三方的擴(kuò)展可以支持 RNN,使得 Torch 基本支持所有主流的網(wǎng)絡(luò)。和 Caffe 類似的是,Torch 也是主要基于 Layer 的連接來定義網(wǎng)絡(luò)的。Torch 中新的 Layer 依然需要用戶自己實(shí)現(xiàn),不過定義新 Layer 和定義網(wǎng)絡(luò)的方式很相似,非常簡(jiǎn)便,不像 Caffe 那么麻煩,用戶需要使用 C++或者 CUDA 定義新 Layer。同時(shí),Torch 屬于命令式編程模式,不像 Theano、TensorFlow 屬于聲明性編程(計(jì)算圖是預(yù)定義的靜態(tài)的結(jié)構(gòu)),所以用它實(shí)現(xiàn)某些復(fù)雜操作(比如 beam search)比 Theano 和 TensorFlow 方便很多。

Lasagne

官網(wǎng)網(wǎng)址:http://lasagne.readthedocs.io/

GitHub:http://github.com/Lasagne/Lasagne

Lasagne 是一個(gè)基于 Theano 的輕量級(jí)的神經(jīng)網(wǎng)絡(luò)庫。它支持前饋神經(jīng)網(wǎng)絡(luò),比如卷積網(wǎng)絡(luò)、循環(huán)神經(jīng)網(wǎng)絡(luò)、LSTM 等,以及它們的組合;支持許多優(yōu)化方法,比如 Nesterov momentum、RMSprop、ADAM 等;它是 Theano 的上層封裝,但又不像 Keras 那樣進(jìn)行了重度的封裝,Keras 隱藏了 Theano 中所有的方法和對(duì)象,而 Lasagne 則是借用了 Theano 中很多的類,算是介于基礎(chǔ)的 Theano 和高度抽象的 Keras 之間的一個(gè)輕度封裝,簡(jiǎn)化了操作同時(shí)支持比較底層的操作。Lasagne 設(shè)計(jì)的六個(gè)原則是簡(jiǎn)潔、透明、模塊化、實(shí)用、聚焦和專注。

Keras

官方網(wǎng)址:http://keras.io

GitHub:http://github.com/fchollet/keras

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

MXNet

官網(wǎng)網(wǎng)址:http://mxnet.io

GitHub:http://github.com/dmlc/mxnet

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

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-6 MXNet 系統(tǒng)架構(gòu)

DIGITS

官方網(wǎng)址:http://developer.nvidia.com/digits

GitHub: http://github.com/NVIDIA/DIGITS

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

CNTK

官方網(wǎng)址:http://cntk.ai

GitHub:http://github.com/Microsoft/CNTK

CNTK(Computational Network Toolkit)是微軟研究院(MSR)開源的深度學(xué)習(xí)框架。它最早由 start the deep learning craze 的演講人創(chuàng)建,目前已經(jīng)發(fā)展成一個(gè)通用的、跨平臺(tái)的深度學(xué)習(xí)系統(tǒng),在語音識(shí)別領(lǐng)域的使用尤其廣泛。CNTK 通過一個(gè)有向圖將神經(jīng)網(wǎng)絡(luò)描述為一系列的運(yùn)算操作,這個(gè)有向圖中子節(jié)點(diǎn)代表輸入或網(wǎng)絡(luò)參數(shù),其他節(jié)點(diǎn)代表各種矩陣運(yùn)算。CNTK 支持各種前饋網(wǎng)絡(luò),包括 MLP、CNN、RNN、LSTM、Sequence-to-Sequence 模型等,也支持自動(dòng)求解梯度。CNTK 有豐富的細(xì)粒度的神經(jīng)網(wǎng)絡(luò)組件,使得用戶不需要寫底層的 C++或 CUDA,就能通過組合這些組件設(shè)計(jì)新的復(fù)雜的 Layer。CNTK 擁有產(chǎn)品級(jí)的代碼質(zhì)量,支持多機(jī)、多 GPU 的分布式訓(xùn)練。

CNTK 設(shè)計(jì)是性能導(dǎo)向的,在 CPU、單 GPU、多 GPU,以及 GPU 集群上都有非常優(yōu)異的表現(xiàn)。同時(shí)微軟最近推出的 1-bit compression 技術(shù)大大降低了通信代價(jià),讓大規(guī)模并行訓(xùn)練擁有了很高的效率。CNTK 同時(shí)宣稱擁有很高的靈活度,它和 Caffe 一樣通過配置文件定義網(wǎng)絡(luò)結(jié)構(gòu),再通過命令行程序執(zhí)行訓(xùn)練,支持構(gòu)建任意的計(jì)算圖,支持 AdaGrad、RmsProp 等優(yōu)化方法。它的另一個(gè)重要特性就是拓展性,CNTK 除了內(nèi)置的大量運(yùn)算核,還允許用戶定義他們自己的計(jì)算節(jié)點(diǎn),支持高度的定制化。CNTK 在 2016 年 9 月發(fā)布了對(duì)強(qiáng)化學(xué)習(xí)的支持,同時(shí),除了通過寫配置文件的方式定義網(wǎng)絡(luò)結(jié)構(gòu),CNTK 還將支持其他語言的綁定,包括 Python、C++和 C#,這樣用戶就可以用編程的方式設(shè)計(jì)網(wǎng)絡(luò)結(jié)構(gòu)。CNTK 與 Caffe一樣也基于 C++并且跨平臺(tái),大部分情況下,它的部署非常簡(jiǎn)單。PC 上支持 Linux、Mac 和 Windows,但是它目前不支持 ARM 架構(gòu),限制了其在移動(dòng)設(shè)備上的發(fā)揮。圖 2-7 所示為 CNTK 目前的總體架構(gòu)圖。

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-7 CNTK的總體架構(gòu)圖

CNTK 原生支持多 GPU 和分布式,從官網(wǎng)公布的對(duì)比評(píng)測(cè)來看,性能非常不錯(cuò)。在多 GPU 方面,CNTK 相對(duì)于其他的深度學(xué)習(xí)庫表現(xiàn)得更突出,它實(shí)現(xiàn)了 1-bit SGD 和自適應(yīng)的 mini-batching。圖 2-8 所示為 CNTK 官網(wǎng)公布的在 2015 年 12 月的各個(gè)框架的性能對(duì)比。在當(dāng)時(shí),CNTK 是唯一支持單機(jī) 8 塊 GPU 的框架,并且在分布式系統(tǒng)中可以超越 8 塊 GPU 的性能。

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-8 CNTK與各個(gè)框架的性能對(duì)比

Deeplearning4J

官方網(wǎng)址:http://deeplearning4j.org/

GitHub: http://github.com/deeplearning4j/deeplearning4j

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

Chainer

官方網(wǎng)址:http://chainer.org

GitHub:http://github.com/pfnet/chainer

Chainer 是由日本公司 Preferred Networks 于 2015 年 6 月發(fā)布的深度學(xué)習(xí)框架。Chainer 對(duì)自己的特性描述如下。

  • Powerful:支持 CUDA 計(jì)算,只需要幾行代碼就可以使用 GPU 加速,同時(shí)只需少許改動(dòng)就可以運(yùn)行在多 GPU 上。

  • Flexible:支持多種前饋神經(jīng)網(wǎng)絡(luò),包括卷積網(wǎng)絡(luò)、循環(huán)網(wǎng)絡(luò)、遞歸網(wǎng)絡(luò),支持運(yùn)行中動(dòng)態(tài)定義的網(wǎng)絡(luò)(Define-by-Run)。

  • Intuitive:前饋計(jì)算可以引入 Python 的各種控制流,同時(shí)反向傳播時(shí)不受干擾,簡(jiǎn)化了調(diào)試錯(cuò)誤的難度。

絕大多數(shù)的深度學(xué)習(xí)框架是基于“Define-and-Run”的,也就是說,需要首先定義一個(gè)網(wǎng)絡(luò),再向網(wǎng)絡(luò)中 feed 數(shù)據(jù)(mini-batch)。因?yàn)榫W(wǎng)絡(luò)是預(yù)先靜態(tài)定義的,所有的控制邏輯都需要以 data 的形式插入網(wǎng)絡(luò)中,包括像 Caffe 那樣定義好網(wǎng)絡(luò)結(jié)構(gòu)文件,或者像 Theano、Torch、TensorFlow 等使用編程語言定義網(wǎng)絡(luò)。而 Chainer 則相反,網(wǎng)絡(luò)是在實(shí)際運(yùn)行中定義的,Chainer 存儲(chǔ)歷史運(yùn)行的計(jì)算結(jié)果,而不是網(wǎng)絡(luò)的結(jié)構(gòu)邏輯,這樣就可以方便地使用 Python 中的控制流,所以無須其他工作就可以直接在網(wǎng)絡(luò)中使用條件控制和循環(huán)。

Leaf

官方網(wǎng)址:http://autumnai.com/leaf/book

GitHub:http://github.com/autumnai/leaf

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

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

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-9 Leaf 和各深度學(xué)習(xí)框架的性能對(duì)比(深色為 forawrd,淺色為 backward)

DSSTNE

GitHub:http://github.com/amznlabs/amazon-dsstne

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

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

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

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

圖2-10 DSSTNE 在稀疏數(shù)據(jù)上與 TensorFlow 的性能對(duì)比

雷鋒網(wǎng)按:在下周二(2月28日)雷鋒網(wǎng)硬創(chuàng)公開課欄目將會(huì)推出黃文堅(jiān)老師的公開課《深度學(xué)習(xí)之經(jīng)典卷積神經(jīng)網(wǎng)絡(luò)的技術(shù)淺析》(點(diǎn)擊了解詳情),歡迎大家報(bào)名!

雷峰網(wǎng)版權(quán)文章,未經(jīng)授權(quán)禁止轉(zhuǎn)載。詳情見轉(zhuǎn)載須知。

TensorFlow和Caffe、MXNet、Keras等其他深度學(xué)習(xí)框架的對(duì)比

分享:
相關(guān)文章

編輯

聚焦數(shù)據(jù)科學(xué),連接 AI 開發(fā)者。更多精彩內(nèi)容,請(qǐng)?jiān)L問:yanxishe.com
當(dāng)月熱門文章
最新文章
請(qǐng)?zhí)顚懮暾?qǐng)人資料
姓名
電話
郵箱
微信號(hào)
作品鏈接
個(gè)人簡(jiǎn)介
為了您的賬戶安全,請(qǐng)驗(yàn)證郵箱
您的郵箱還未驗(yàn)證,完成可獲20積分喲!
請(qǐng)驗(yàn)證您的郵箱
立即驗(yàn)證
完善賬號(hào)信息
您的賬號(hào)已經(jīng)綁定,現(xiàn)在您可以設(shè)置密碼以方便用郵箱登錄
立即設(shè)置 以后再說