-
1 # 機器之心Pro
-
2 # 程式設計字典
如果我們想開始編碼一個深度神經網路,最好我們有一個想法,不同的框架如Theano,TensorFlow,Keras,PyTorch等是如何工作的。
Theano是一個python庫,它提供了一套用於構建在我們的機器上快速培訓的深層網路的功能。
Theano由加拿大蒙特利爾大學在Yoshua Bengio領導下發展成為一位深度網路先鋒。
Theano讓我們定義和評估數學表示式,其中矩陣是矩形陣列。
從技術上講,神經網路和輸入資料都可以表示為矩陣,所有標準網路操作都可以重新定義為矩陣運算。這很重要,因為電腦可以非常快速地執行矩陣操作。
我們可以並行處理多個矩陣值,如果我們用這個底層結構構建一個神經網路,我們可以使用一臺帶有GPU的機器在合理的時間視窗內訓練巨大的網路。
但是,如果我們使用Theano,我們必須從頭開始建立深層網路。該庫不提供用於建立特定型別的深層網路的完整功能。
相反,我們必須編碼深層網路的每個方面,如模型,圖層,啟用,訓練方法和任何特殊的方法來停止過度擬合。
然而,好訊息是Theano允許我們在向量化函式的頂層實現構建,為我們提供高度最佳化的解決方案。
還有許多其他庫擴充套件了Theano的功能。TensorFlow和Keras可以與Theano一起用作後端。
用TensorFlow深入學習谷歌TensorFlow是一個Python庫。這個庫是構建商業級深度學習應用程式的絕佳選擇。
TensorFlow從另一個圖書館DistBelief V2誕生,它是Google Brain Project的一部分。該庫旨在擴充套件機器學習的可移植性,使研究模型可以應用於商業級應用。
與Theano庫非常相似,TensorFlow基於計算圖,其中節點表示持久資料或數學運算,邊表示節點之間的資料流,即多維陣列或張量; 因此得名TensorFlow
一個操作或一組操作的輸出作為輸入被饋送到下一個。
儘管TensorFlow是為神經網路設計的,但對於可以將計算模型化為資料流圖的其他網路來說,它非常適用。
TensorFlow還使用了Theano的幾個特性,如常見和子表示式消除,自動分化,共享和符號變數。
可以使用TensorFlow(卷積網,自動編碼器,RNTN,RNN,RBM,DBM / MLP等)構建不同型別的深網。
但是,在TensorFlow中不支援超引數配置。對於此功能,我們可以使用Keras。
與凱拉斯深度學習Keras是一個功能強大且易於使用的Python庫,用於開發和評估深度學習模型。
它具有簡約的設計,可以讓我們逐層建立網路; 訓練它,並執行它。
它包裝了高效的數值計算庫Theano和TensorFlow,並允許我們用幾行簡短的程式碼定義和訓練神經網路模型。
它是一個高階神經網路API,有助於廣泛使用深度學習和人工智慧。它執行在包括TensorFlow,Theano等許多底層庫上面。Keras碼是行動式的; 我們可以在Keras中使用Theano或TensorFlow作為後端而不需要對程式碼進行任何更改來實現神經網路。
Python深度學習應用程式原文:http://codingdict.com/article/8355
-
3 # 河馬的實驗室
不用選了,語言用Python,框架用pytorch。TensorFlow你用不慣,程式結構是硬體設計的思維模式,不是普通程式設計模式。
不信你去各種語言和框架都折騰一遍,最後還會回到我說的這兩樣。
theano都停止開發和維護了,人家都不幹了,怎麼還有人推薦theano?
-
4 # 助考筆記
強烈推薦Pytorch,只要你熟悉numpy,就能無縫操作torch tensor。
Pytorch的文件詳盡,教程完善,開源模型豐富,是您煉丹的不二選擇。
回覆列表
TensorFlow
連結:https://www.tensorflow.org/
對於那些聽說過深度學習但還沒有太過專門深入的人來說,TensorFlow 是他們最喜歡的深度學習框架,但在這裡我要澄清一些事實。
在 TensorFlow 的官網上,它被定義為「一個用於機器智慧的開源軟體庫」,但我覺得應該這麼定義:TensorFlow 是一個使用資料流圖(data flow graphs)進行數值計算的開源軟體庫。在這裡,他們沒有將 TensorFlow 包含在「深度學習框架」範圍內,而是和 Theano 一起被包含在「圖編譯器(graph compilers)」類別中。
在結束了 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
連結:https://keras.io/
「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
連結:http://torch.ch/
在這個世界上每天仍有很多戰爭,但是一個優秀的「勇士」(西班牙語「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。
原文連結:https://medium.com/@ricardo.guerrero/deep-learning-frameworks-a-review-before-finishing-2016-5b3ab4010b06#.z8zuthuwm