到底該選擇TensorFlow還是Keras,是深度學(xué)習(xí)初學(xué)者經(jīng)常糾結(jié)的一個(gè)問題。數(shù)據(jù)科學(xué)家Aakash Nain比較了TensorFlow和Keras,希望有助于選擇合適的框架。
深度學(xué)習(xí)庫/框架流行度(來源:Google)
深度學(xué)習(xí)無處不在,大量的深度學(xué)習(xí)庫讓初學(xué)者無所適從。這篇文章重點(diǎn)關(guān)注TensorlFlow和Keras兩者之間的選擇。TensorFlow是最著名的用于深度學(xué)習(xí)生產(chǎn)環(huán)境的框架。它有一個(gè)非常大非常棒的社區(qū)。然而,TensorFlow的使用不那么簡(jiǎn)單。另一方面,Keras是在TensorFlow基礎(chǔ)上構(gòu)建的高層API,比TF(TensorFlow的縮寫)要易用很多。
既然Keras基于TensorFlow,那么兩者有何區(qū)別?既然Keras對(duì)用戶更友好,為什么我還需要使用TF來構(gòu)建深度學(xué)習(xí)模型呢?下面一些內(nèi)容將幫助你做出選擇。
快速開發(fā)原型
如果你想快速創(chuàng)建、測(cè)試一個(gè)神經(jīng)網(wǎng)絡(luò),寫盡可能少的代碼,那么選擇Keras?;ú涣硕嗌俜昼姡憔湍苡肒eras創(chuàng)建簡(jiǎn)單或很復(fù)雜的神經(jīng)網(wǎng)絡(luò)。Model和SequentialAPI如此強(qiáng)大,基本上能做到你可能想要做的任何事情。讓我們看一個(gè)例子吧:
model = Sequential()
model.add(Dense(32, activation='relu', input_dim=100))
model.add(Dense(1, activation='sigmoid'))
model.compile(optimizer='rmsprop',
loss='binary_crossentropy',
metrics=['accuracy'])
# 生成虛假數(shù)據(jù)
import numpy as np
data = np.random.random((1000, 100))
labels = np.random.randint(2, size=(1000, 1))
# 訓(xùn)練模型,迭代數(shù)據(jù)(每個(gè)batch包含32個(gè)樣本)
model.fit(data, labels, epochs=10, batch_size=32)
收工??!就是這么容易!
Keras的開發(fā)設(shè)計(jì)注重用戶友好,因而某種意義上它更加pythonic。模塊化是Keras的另一個(gè)優(yōu)雅的設(shè)計(jì)指導(dǎo)原則。Keras中的任何東西都可以表示為模塊,用戶可以根據(jù)需要將其進(jìn)一步組合。
彈性
有時(shí)候你不想用現(xiàn)成的東西,想要自己定義一些東西(比如,損失函數(shù)、測(cè)度、網(wǎng)絡(luò)層,等等)。
盡管Keras 2的設(shè)計(jì)讓你可以實(shí)現(xiàn)幾乎所有你想要的東西,但是我們都知道底層的庫提供了更多彈性。TF同樣如此。相比Keras,TF允許你進(jìn)行更多調(diào)整。
功能性
盡管Keras提供了創(chuàng)建深度學(xué)習(xí)模型一般所需的所有功能性,它還是不如TF提供得多。相比Keras,TensorFlow提供更多高級(jí)操作。當(dāng)你從事研究或開發(fā)特殊種類的深度學(xué)習(xí)模型時(shí),這一點(diǎn)是十分便利的。下面是一些例子:
線程和隊(duì)列
隊(duì)列是一個(gè)強(qiáng)大的機(jī)制,可以異步地計(jì)算圖中的張量。類似地,你可以使用多個(gè)線程執(zhí)行同一會(huì)話,通過并行運(yùn)算加速操作。下面是一個(gè)在TensorFlow中使用隊(duì)列和線程的簡(jiǎn)單例子:
# 創(chuàng)建圖,等等。
init_op = tf.global_variables_initializer()
# 創(chuàng)建會(huì)話,以運(yùn)行圖中的操作。
sess = tf.Session()
# 初始化變量(比如epoch計(jì)數(shù)器)
sess.run(init_op)
# 開始輸入入隊(duì)線程。
coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)
try:
whilenot coord.should_stop():
# 運(yùn)行訓(xùn)練步驟,等等
sess.run(train_op)
except tf.errors.OutOfRangeError:
print('訓(xùn)練完畢——達(dá)到epoch限制')
finally:
# 結(jié)束時(shí),請(qǐng)求停止線程
coord.request_stop()
# 等待線程終止。
coord.join(threads)
sess.close()
調(diào)試器
TensorFlow有一個(gè)專門的調(diào)試器,為內(nèi)部結(jié)構(gòu)和正在運(yùn)行的TensorFlow圖的狀態(tài)提供了可見性。從調(diào)試器獲得的洞見可以加速調(diào)試訓(xùn)練和推斷階段的多種bug。
TensorFlow調(diào)試器截屏(來源:TensorFlow文檔)
控制
就我的經(jīng)驗(yàn)而言,你對(duì)神經(jīng)網(wǎng)絡(luò)的控制越多,你對(duì)神經(jīng)網(wǎng)絡(luò)在做什么的理解就更深。TF讓你可以更多地控制神經(jīng)網(wǎng)絡(luò)。在TF中對(duì)權(quán)重和梯度進(jìn)行操作有如神助。
例如,假設(shè)你的模型有三個(gè)變量,比如w、b、step,你可以選擇變量step是否可以訓(xùn)練。你只需寫一行代碼就可以辦到:
step = tf.Variable(1, trainable=False, dtype=tf.int32)
在訓(xùn)練階段,梯度可以提供大量信息。你想控制梯度?當(dāng)然可以,看下面的例子:
# 創(chuàng)建優(yōu)化器
optimizer = GradientDescentOptimizer(learning_rate=0.1)
# 為一組變量計(jì)算梯度
grads_and_vars = opt.compute_gradients(loss, )
# grads_and_vars是一個(gè)元組的列表(梯度, 變量)。
# 你可以隨意對(duì)梯度部分進(jìn)行操作,比如,每項(xiàng)減1.
subtracted_grads_and_vars = [(gv[0] - 1.0, gv[1]) for gv in grads_and_vars]
# 請(qǐng)求優(yōu)化器應(yīng)用減一后的梯度。
optimizer.apply_gradients(subtracted_grads_and_vars)
(以上代碼樣例取自 CS 20SI: TensorFlow for Deep Learning Research)
結(jié)論(TL;DR)
除非你正從事研究性質(zhì)的工作或開發(fā)某種特殊種類的神經(jīng)網(wǎng)絡(luò),選擇Keras(相信我,我是一個(gè)Keras黨?。。┦褂肒eras快速構(gòu)建非常復(fù)雜的模型仍然超容易。
如果你想要更精細(xì)地控制你的網(wǎng)絡(luò),或者想要仔細(xì)查看你的網(wǎng)絡(luò)發(fā)生了什么,那么TF是正確的選擇(不過有時(shí)TF的語法會(huì)讓你做噩夢(mèng)的)。不過,現(xiàn)在TF已經(jīng)集成了Keras,所以更明智的做法是使用tf.contrib.Keras創(chuàng)建你的網(wǎng)絡(luò),然后根據(jù)需要在你的網(wǎng)絡(luò)中插入純TensorFlow。簡(jiǎn)而言之,
tf.contrib.keras+tf=你所需要的一切
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4717瀏覽量
100009 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5422瀏覽量
120593 -
tensorflow
+關(guān)注
關(guān)注
13文章
327瀏覽量
60413
原文標(biāo)題:TensorFlow還是Keras?深度學(xué)習(xí)框架選型指南
文章出處:【微信號(hào):jqr_AI,微信公眾號(hào):論智】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論