如何比較Keras, TensorLayer, TFLearn ?

Keras: Keras Documentation

GitHub - fchollet/keras: Deep Learning library for Python. Convnets, recurrent neural networks, and more. Runs on Theano or TensorFlow.

TensorLayer: Welcome to TensorLayer

GitHub - zsdonghao/tensorlayer: TensorLayer: Deep learning and Reinforcement learning library for TensorFlow.

TFLearn: TFLearn - TensorFlow Deep Learning Library

GitHub - tflearn/tflearn: Deep learning library featuring a higher-level API for TensorFlow.


這三個庫主要比的是API設計水平,不得不說原始的 Tensorflow API的確反人類,我承認它的完善、表達能力強,性能好,但是介面設計對人類非常不友好。

這就給了做高層抽象API封裝的生存空間,Keras Tensorlayer TFLearn 是目前比較成熟的幾個庫。

做個比喻,Tensorflow就像當年的 Win32 API,功能強大但是難以使用,隨便做點小事情就要寫很多代碼,我清楚記得我寫個顯示空白窗口的程序就要40來行。

Tensorlayer比較像 WTL,把一些繁瑣的代碼封裝成更容易使用的介面,但是仍然保留了對底層API調用的能力,抽象的層次不高,仍然可以看到底層的 數據結構和網路結構。比如 可以看到 Session和Placeholder等。

TFLearn比較像 MFC,抽象的層次更高,創造了自己的一套子語法,代碼可讀性更好,屏蔽了底層難以理解的東西。

Keras比較像 Qt,很高的抽象層次,甚至跨越了多個深度學習框架,完全看不到底層的細節了,甚至某些情況需要觸碰底層的對象和數據反而非常麻煩。

不同的抽象層次帶來不同的學習難度,適應不同的需求。

基本建議:

如果只是想玩玩深度學習,想快速上手 -- Keras

如果工作中需要解決內部問題,想快速見效果 -- TFLearn 或者 Tensorlayer

如果正式發布的產品和業務,自己設計網路模型,需要持續開發和維護 -- Tensorlayer

以上只是個人建議,具體情況因人而異。


之前用 TFlearn 現在轉為 TL,因為 TL 的源碼簡單易懂,能夠全盤掌握的感覺很好。

有人總結了一些技巧供大家參考:wagamamaz/tensorlayer-tricks


更新:用了 TensorLayer 1.2版本之後,再也不想用別的庫了 ,做transfer learning 杠杠的

----------------------------------------------------------------

剛好三個庫我都用過,回答一下。

首先它們都是把神經網路抽象成不同的Layer,以便用戶自定義網路。

Keras

優點:Theano時代就推出了,使用者較多,有個人維護的中文文檔,雖然更新很慢。純scikit-learn式編程,隱藏了數據流的細節,數據流沒有敘述的很清楚,到目前為止,並沒有理解keras的時間數據輸入方式...

缺點:運行TensorFlow時很慢,拓展性差(國外測評說是因為 Keras 最開始只是為了 Theano 而開發的,TensorFlow發布後才寫支持TensorFlow的代碼,所以為了兼容犧牲了效率)。不適合科研單位和企業,換句話說畢業以後要重新學另外一個框架..... 複雜的情況會出現error,這時候調試只能靠運氣了。。

TensorLayer

優點:對學術界的優勢是靈活性很強,甚至可以很簡單地實現動態網路結構(Neural Modular Network).... 對工業界的優勢是運行速度快。教程很強大,還包含了 Google TensorFlow 官網的模塊化實現。同時提供scikit-learn式的API,和專業級的API,適合新手到老手過渡。

缺點:剛剛推出(16年8月份)使用者少,但我發現中文使用者不少,有很多微信群、qq群可以交流,有可能和TL官方推出中文文檔有關。

Tflearn

優點:不像Keras那樣兼容兩種後端,所以效率比 Keras 快,但根據國外測評還是比 TensorLayer慢一些。

缺點:維護不好,作者居然在github issues那裡說 「有時間再實現 seq2seq」,我暈... 有對話為證Seq2Seq Machine Translation · Issue #120 · tflearn/tflearn · GitHub

國外對 TensorLayer 和 Keras 比較的結論基本是企業界和學術界使用 TensorLayer+TensorFlow 搭配,學生使用Keras(若未來想從事機器學習的工作,我個人建議還是好好看下TensorFlow吧)。

個人觀點:學習 TensorFlow 是一個大趨勢,題主提到的庫都是基於 TensorFlow 開發的,選擇一個庫非常關鍵。若想熟練掌握深度學習,不妨先學習下 TensorFlow 本身,參考:TensorFlow如何入門? - 科技

補充==================

找到一個測評,Keras的速度很慢很慢。在跑MNIST時(784-800-800-10,batch size=500),每個epoch耗時如下:

TensorLayer ≈ 750ms

Tflearn ≈ 950ms

Keras ≈ 1500ms

TensorLayer 1.2 發布啦,官網對其他庫做了比較,性能上說 TensorLayer 是工業級的庫,同時也能讓科學家方便地實現超級複雜演算法。

A frequent question regarding TensorLayer is that why do we develop a new library instead of leveraging existing ones like Keras and Tflearn. TensorLayer differentiates from them with its pursuits for flexibility and performance. A machine learning user may find it comfortable to bootstrap with Keras and Tflearn. These libraries provide high-level abstractions and hide many details of low-level engine from users. Though good for using, it becomes hard for us to tune and modify from the bottom when tackling domain-specific problems (i.e., one model does not fit all). However, flexibility does not always mean the loss of performance. TensorLayer allows seamless distributed and heterogeneous deployment with its first-class support for TensorFlow.


簡單說一下個人的使用感受。

首先對於初學者來說,這幾個庫的關係搞清楚,基本就成功一大半了。其中tensorflow和theano是一級的,他們都是最基礎的框架,其完備程度更像是一種編程語言了,所以這兩個框架不只是可以用來做DL,還可以寫別的東西。keras、tflearn和tensorlayer都是在此基礎上搭建的二次封裝庫,其中keras可以使用theano和tf做後端,剩餘兩個只針對tf。

難易程度上而言,keras是最簡單的,封裝非常完善,底層不透明,隨意切換後端、任意切換CPUGPU而基本不用改動代碼,非常適合初學者。我覺得keras最好的一點是,對於theano和tf這樣奇怪的圖模型計算模式做了很好的屏蔽,使得整個編程的流程更加像是一般的代碼程序。一般初學者都會對先架構計算圖然後喂進數據執行運算很困惑,然而keras盡了最大可能屏蔽掉了這種模式機制,讓整個程序看起來更像是一般的程序,甚至不懂theano和tf的人可以直接拿來上手幹活。當然,keras的缺點也很明顯,速度較原生的tf和theano要慢一些,而且由於封裝過於完善,靈活性就降低了。

tensorlayer是新出現的一個頂層庫,他的好處是對tf做了一個恰到好處的補充。tf有一個很大的問題就是太過底層,如果你要架構一個複雜網路,你和希望一些常規的部件可以被直接調用而不用過分的自己操心。這時tl是絕佳選擇,他的代碼幾乎是透明的,你心裡很清楚數據在這些封裝好的函數背後是怎麼流動的,這一點強於keras,速度也快於keras,但是其封裝效果就弱了一些,因此需要懂一些tf的運作機制才能順利完成任務。

另外theano相比於tf,GPU上編譯的速度難以忍受,而且tf越來越受歡迎,所以還是推薦用tf。


有群友說這個問題下怎麼沒有Keras使用者回答呢,那我來回答吧,其他兩個了解的不多,Keras了解的還稍微多一點,簡單說一下Keras這個東西。

1. 高度封裝,適宜新手

Keras的封裝應該是所有庫里出了名的高,基本上搭建和訓練一個神經網路只需要很少的一些代碼即可,十分適宜新手上手。這是優點。

高度封裝帶來的缺點就是內部運算細節就被隱去了,很多人抱怨Keras只看函數結構根本就不知道是怎麼用的,很多都要去看源代碼。這個是高度封裝帶來的必然代價。使用別的框架可能你能控制很豐富的細節,但上手就會比較慢。

講真,深度學習框架還算是一個比較龐大的系統,指望很輕鬆就上手是不太現實的。不管是Keras還是別的什麼框架,在學習中都會遇到一個很陡的曲線,區別在於Keras的這段「蜀道難」在學習的中部出現,而其他框架的「蜀道難」在一開始學習就會出現而已。

2. 文檔和討論區

Keras的中文文檔是我在維護的,樓上有說中文文檔更新很慢,這個就冤枉了= =基本上每一版Keras release以後都會在幾天內把文檔更新了,如果版本有較大規模的改動,我會在專欄知乎專欄里彙報出來。各位如果發現文檔有缺失、錯漏和需要更新的地方,或者在keras使用過程中有什麼疑問,也可以在keras-cn的github里提issue(MoyanZitto/keras-cn),我會儘力處理。

Keras的官方github下也是討論很活躍的地方,但是人太多了可能你的問題會被淹沒哦

不過個人覺得Keras的討論氛圍還算是比較好了

3. 更新速度與示例代碼

Keras的代碼更新速度是很快的,基本上不到一個月就有一版新的release,github的PR數目也是非常高。示例代碼中有許多是比較先進的研究內容,而且以一個很快的速度在增加,這裡也希望各位有好的example可以貢獻到Keras中。

我的專欄也會定期寫一些示例代碼分析的文章,明年應該會寫的比較多,最近就算了。

4. 框架特色

模塊化程度較高,有相當一部分內容可以定製。純Python編寫,代碼閱讀和改動比較方便。兼容Tensorflow,可以搭TF的東風做很多事情,整個框架跟Python科學計算環境融合的還算不錯,numpy,scipy,scikit-learn,Tensorflow都可以與Keras駁接。

主要缺點有:debug困難,這是所有符號式框架的通病。layer type還不夠豐富,至少做目標檢測這塊,RCNN,Faster-RCNN什麼的都很難實現。有部分結構上的問題,例如metrices顯然不應該設計為計算圖的一部分。可繼承的前人工作較少,儘管keras已經開始重點打造Application這個模塊,使得大家可以使用別人訓練好的模型,但總的來說現在只有VGG,resnet50,Inception,Xception和一個RCNN(做音樂標籤的)可用,還需要進一步豐富。另外支持兩個後端有時候會帶來很多麻煩。

5. 學習方法

(1)對符號式框架運算規則有大致了解(2)對Keras核心概念和各個模塊的作用要有一定把握(3)先把文檔通讀一遍再說,不然問的問題很搞笑(5)遇到不懂的多看源代碼,最好能把topology,training這兩個文件的代碼讀完。(6)多練手多debug

6. 未來展望

Keras多應用於前沿的科學研究和數據挖掘競賽中,在工業場合好像應用不是很多。

總的來說,作為Tensorflow的wrapper,我傾向於用戶在使用Keras的時候能對Tensorflow有更進一步了解,雖然作為一個完整的學習框架,即使對tf一點都不懂(比如我),你也可以用Keras做任何你想做的事情,但我覺得mxnet,Tensorflow才是最有前景的兩個框架,Keras可以作為搭建快速原型的框架使用,也可以作為Tensorflow的高層封裝與tf聯合使用。

如果將Tensorflow和mxnet比作C++和Java,我想Keras就是Python。有餘力的情況下掌握TF和Keras可能更有利於個人發展。

此外對Keras的整體發展目前我是看好,繼續加強跟tf綁定的話能吃不少Google爸爸的紅利,theano差不多該扔就可以扔了。便於新手學習的特點也有利於Keras在眾多競爭者中保有一席之地。

Keras在12月的排名里排在了第二名,僅次於Tensorflow,現在我們基本上可以說,keras已經不是一個【小眾】的選擇了。

以上。


tflearn用的比較多,也共現了一點小代碼,感覺比keras方便,對於上面說的seq2seq問題,這個作者已經標了"contributions welcome",作者不可能各種都了解的,需要有專業的小夥伴去contribute, 這個肯定是受歡迎的;tensorlayer還沒有用過,之後去試用下;反而我覺得tflearn得維護挺給力的,我提出的issue 很快都可以得到反饋


有幾個同學私信我,問若一定要選擇一個庫,到底哪個庫比較好。

其實我的答案就是原文里最後一句話:若真要說那個庫好?選擇一個你能看懂源碼的庫吧。

千萬不要被看表面,最終適合的一定是自己能夠完全掌握的。最簡單的辦法就是打開github,找出dense 層比較一下(dense層所有庫都會提供的),當然看源碼之前建議先看完 Tensorflow mnist 教程。

我個人覺得Tensorlayer 的實現挺新穎的,極簡主義、透明主義。

以下是原文----------------

大家回答的都不錯,但有些點沒有被提到,最近幾年因為工作原因,慢慢接觸人工智慧技術,也面試過各種各樣的人,我也來說說我的看法。

可以說,Tensorflow 是目前發展最快的框架之一,題目里提到的庫都支持 Tensorflow的,能不能支持 Theano 估計關心的人極少。

我現在在百度工作,雖然百度內部有自己常用的一些深度學習庫,但招聘的時候很少會遇到人使用過百度的庫。所以這半年我幫 HR 和創業的朋友面試技術部分時,能遇到各種各樣的人,也了解僱主是怎麼想的。

其實做深度學習主要就看兩點,1. 會不會訓練大型數據集(100GB 以上)。2. 搭模型時自定義的能力高不高。

第一點:處理大型數據集,我覺得 Tensorflow提供的Tfrecord 是最好一種方法,因為它把數據讀取和 data augmentation 集合到了一起,比如 cifar10例子中,就先把數據保存成 Tfrecord格式再用 TFRecordReader來讀取。Google 開源項目里的Tensorflow 代碼全是用TFRecord 處理大型數據的。例子:tensorlayer/tutorial_cifar10_tfrecord.py at master · zsdonghao/tensorlayer · GitHub

當然,處理小數據時,為了寫代碼方便,忽略運行效率,還是可以用 python threading 的。

例子:1. API - Preprocessing 2. Image Preprocessing

不過工業界的數據往往非常大(我朋友創業,文本數據居然收集了有200多個G,你想想看。。),用python threading 完全不能夠勝任的。所以僱主怎麼想的,也差不多是這樣,除非僱主的數據少得可憐,但深度學習公司第一步就是拼誰數據多,誰的數據質量好呀,數據少的公司你會選擇么?

第二點:實際應用中,模型會因為數據的客觀情況來改變,而深度學習可以分為3個級別 What, How, Why。 跑過一些公有數據集的人處在What級別,就是懂深度學習是什麼;進一步能夠用深度學習解決實際問題的人處在How級別,知道如何使用深度學習;接下來是是Why級別,明白其中原理,然後才能回過頭來更好地解決How的問題。若想從事人工智慧工作,不能達到Why級別在公司里是混不下去的,不然就和剛剛用深度學習做過畢業設計的學生沒有什麼區別。

現在面試的人,95%都是用過一個高級庫,用 python 跑過幾個小 project 就說自己懂人工智慧了,這種通常就end了。有很多人號稱會用Tensorflow,其實編程能力為0,甚至有人連 get_variable 和 variable 有什麼區別都回答不出來的,比我還弱。

無論用什麼庫,Tensorflow一定要懂,不然就是扯淡,模型的數據流一定要完全自己掌握,否則只能處於What 和 How之間的位置。

所以即使用高級庫時,也要看它的源碼,了解其中的實現方法。我看keras 和 tensorlayer 網站都有源碼說明例子。為了工作效率,可以選擇一個自己能完全掌握源碼的高級庫,再加上Tensorflow 一起使用,這樣就能夠勝任根據數據情況自定義模型的工作了。

回到 Tensorflow吧,若你真心想學好它,以後真的準備找人工智慧方向的工作,你就要拿出些東西證明。比如我遇到過一個面試者,問他怎麼證明他對Tensorflow熟悉,他說他在Tensorflow github上push過2次,並且都accept了。這個就是很好的一個證明,其實這和很多人讀博士發表論文是一樣,發表論文也是希望得到大家的認可,相當於一種能力證明。

當然在Tensorflow上做貢獻難度比較高,或許你可以在 github 上找一些比較大的 project 來貢獻,選擇題目里說的的庫也不錯。

若真要說那個庫好?選擇一個你能看懂源碼的庫吧。


TFlearn沒用過,keras封裝的太死,適合新手使用,但是呢就是數據維度的問題容易頭大。最近轉到tensorlayer,感覺相當好用,既有keras的搭積木的模塊化特點,又保留了tensorflow自定義的靈活性,和tl的作者有幾次郵件來往,維護更新速度還是很快的,推薦之。

謝謝實驗室師妹 @張思朋做了一個實驗,在相同網路模型結構和參數的情況下,對三個框架的運行時間進行了對比,運行速度Tensorflow&>tensorlayer&>keras可供大家參考

備註一下這裡TensorFlow的nn實驗用的是梯度下降,而其他五次實驗都是隨機梯度下降,所以這裡有個錯誤,實際上TensorFlow的nn實驗應該用16秒左右,準確度應該在0.91左右

備註一下


好消息!TensorLayer獲得了ACM Multimedia 2017年度最佳開源軟體獎。這是Akara演講用的PPT: ACM MM Presentation PPT

=== 以下是舊回答

謝謝邀請。

更多內容可看我的 Quora 回答 :How do the Keras and TensorLayer libraries compare?

也歡迎大家一起加入微信群交流學習人工智慧技術 TensorLayer交流群

=== 以下是舊回答

首先TensorLayer 和 Keras 的定位是不一樣的,不能說哪個好哪個壞,要因人而異。

Keras 把東西封裝得非常 high-level,使用TensorFlow作為後端時甚至不需要定義 placeholder. 這種定位的優點是使用時會覺得非常簡單。缺點是後期很難明白其數據流和數據迭代的過程,比如:每個epoch之前初始化RNN狀態 和 每個 iteration之前初始化RNN狀態 是完全不一樣的,Keras 很難讓用戶控制這些過程。優點不言而喻,搭建常規網路非常簡單,不需要明白具體的細節。Keras也在往讓用戶更好地控制底層發展,但每個庫的設計目標都是不一樣的,效果不如其他庫。

TensorLayer 的定位是透明化,儘可能地使用 TensorFlow 的代碼,數據迭代完全透明用戶可控,同時也提供scikit式的 fit(), test(), predict() 方法。interface設計簡單,因此能與其它庫無縫對接(如,使用SlimNetsLayer 與 Tf-slim 對接),這樣 google pre-train 好的大量 CNN 模型就可以直接在 TensorLayer 使用了,接下來還計劃無縫對接更多的庫(據我所知能做到這點的庫,目前只有TL了)。此外還準備推出TensorFlow以外的分散式方案和FPGA/ASIC方案,適合工業界使用。缺點也很明顯,要使用TL,就必須有TF背景知識,加大了快速上手的難度。更多比較可參考 Review of TensorFlow sugar coatings

使用者社區方面,Keras 發布比 TensorLayer 早很多,使用人數比 TensorLayer 多。但TensorLayer 是官方支持中文社區的,中文文檔更新速度基本與英文文檔同步,還有官方中文微信群,QQ群答疑,所以未來中文社區會很強大。

總體來說,TensorLayer 的設計理念,是儘可能地滿足不同階段用戶,不同階段都不需要重寫代碼,越到後面越能發現它的優勢。


用過 keras,導師讓開發一個複雜的網路,發現用 keras提供的 layer 壓根搭不出來,不得不做底層操作,弄了很久很久才搭建出來,然後運行時出現各種坑,nan問題,TensorFlow更新同步問題,最後所有 training 部分都用 TensorFlow 寫的... 只有一些通用 layer 用到了 keras。

所以說,若想控制底層,或做複雜的網路,請放棄Keras吧,直接用TensorFlow搭都比用Keras快,這是真心大實話。


不能認同 @張蕊 跟 @董豪 對Keras的缺點評價, 只拿Keras用來構造拓樸, 那些問題就可以迎刃而解

設 m 是 Keras Model 的物件, 那 m.inputs, m.outputs, m.trainable_weights 就是沒有任何封裝的最底層Theano/Tensorflow變數, 一下就抓出所有可直接底層操作的變數

Functional API可以用直覺的方式拼出含共享權重的複雜拓樸, 減少重複代碼. 可以把Model當作一般的Layer用, 一個Model的實例可以是更大Model的一部分, 同時可以個別操作.

綜上述, Keras 模組化封裝應是這三者最好的, 還直通最底層變數

@張蕊 說的慢速是因為Keras的Optimizer封裝較多, 驗證不少條件. 但只要調出上述底層變數, 就可以直接用Tensorflow的Optimizer了, 不一定要使用Keras的Optimizer

@董豪 說的透明化, 有了底層變數也可以解決


作為一個使用tf的新手,都用過...各位吐槽的keras速度慢我還真沒體會出來

拋開速度,你去官網看看文檔不就知道哪個功能多了?你去github看看更新不就知道哪個維護勤了嘛?

keras的star8k+其中當然不乏其theano版本的貢獻

tflearn的star3.8k

tensorlayer是600

(收星統計截至於十月一日)

keras的模型抽象分兩種:

functional model 與tensorflow符合

sequential model與theano和caffe符合

backend分tensorflow和theano

tflearn與tensorlayer的模型抽象是functional model,

backend只能是tensorflow

官方api:keras與tensorlayer有中英文,tflearn貌似只有英文

集成度上限來說:keras&>=tflearn&>&>tensorlayer

推薦從theano轉過來的或者長期使用scikit的繼續使用keras

搭建主流image classification網路且不怎麼大改動,塗省事兒的用tflearn (個人感受tflearn在image classification相關上的實現功能最多)

(因為看到利益相關的人轉發了這個問題,就去掉了對mxnet和tensorlayer的類比:)

--------------------------------------------------------------------------------------

鑒於下面討論激烈,我更正:tensorlayer在donghao的貢獻下commit頻率也不比前兩者少

並且,答案肯定有主觀成分,至於功能自己去官方api看

兩位tl貢獻者在下面回復也是很客氣,所以請大家可以試試tensorlayer,覺得舒服就支持支持


TL的一些庫設計上還不是特別成熟,需要靠社區慢慢改進(提了兩個issue的小透明如是說


入門的時候用的是keras,總體感覺蠻方便的,不過當時還是初學者。

話說keras有沒有按batch讀數據的api,到底是我沒找到還是沒有...反正最後我用了自己寫的api來玩了。


TFlearn是絕對的入門迅速應用級

為什麼?簡單的神經元理論知識你都不用懂,照著example。瞎j*亂改都能做出來。

不過建議研究一下基本原理。。。答主高中狗,靠著TFlearn 水出了水水的Highway network,是一個反饋很積極的庫,大概ResNet這樣的說不定會加?

原理真難啊QAQ,各種奇怪bug就全靠google了。

Keras和TL我感覺不算太新手友好,不過絕對比源碼甚至C++高到不知道哪裡去了。TF要多讀庫的源碼?不然bug都不知道怎麼搞。TL因為不太新手友好,Keras貌似沒有最新的?

所以個人推薦小白速成TF,學習Keras,生產TL吧。

以上全為瞎j*亂答,望輕噴


TensorLayer 說明文檔簡直就是坨狗屎,示例解釋 跟示例代碼完全對不上,寫的糊裡糊塗的,然後中文文檔就是直譯,一點也不通順,沒人能翻譯好一點嗎


可以上github上搜sugartensor,非常棒。不過新版本的自帶layer,應該回成為大趨勢吧。


推薦閱讀:

ICML 2016上哪些論文值得關注?
寫一個像Keras的深度學習框架需要學習哪些知識?
對於一個可以窮舉的問題,比如五子棋,深度學習得到的模型和窮舉的演算法有啥異同?
如何系統的學習深度學習?
如何評價 Facebook 新推出的 CNN 機器翻譯項目 Fairseq?

TAG:機器學習 | 深度學習DeepLearning | 強化學習ReinforcementLearning |