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