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