(謝邀。利益相關:Google Brain員工,參與TensorFlow和Keras的編寫)
要回答這個問題,首先需要簡單談一下keras的歷史。keras是Fran?ois Chollet於2014-2015年開始編寫的開源高層深度學習API。所謂「高層」,是相對於「底層」運算而言(例如add,matmul,transpose,conv2d)。keras把這些底層運算封裝成一些常用的神經網路模塊類型(例如Dense, Conv2D, LSTM等),再加上像Model、Optimizer等的一些的抽象,來增強API的易用性和代碼的可讀性,提高深度學習開發者編寫模型的效率。keras本身並不具備底層運算的能力,所以它需要和一個具備這種底層運算能力的backend(後端)協同工作。keras的特性之一就是可以互換的後端,你在所有後端上寫的keras代碼都是一樣的。從一個後端訓練並存儲的模型,可以用別的後端載入並運行。
keras最初發行的時候,tensorflow還沒有開源(fchollet開始寫keras的時候還未加入Google)。那時的keras主要使用的是Theano後端。2015年底TensorFlow開源後,keras才開始搭建TensorFlow後端。今天TensorFlow是keras最常用的後端。
2016-2017年間,Google Brain組根據開源用戶對TensorFlow易用性的反饋,決定採納keras為首推、並內置支持的高層API。當時TensorFlow已經有tf.estimator、slim、sonnet、TensorLayers等諸多高層次API,選擇keras主要是考慮它的優秀性以及在用戶羣中的受歡迎程度,不過那個是另一個故事線就不展開說了。
所以,keras的代碼被逐漸吸收進入tensorflow的代碼庫,那時fchollet也加入了Google Brain組。所以就產生了tf.keras:一個不強調後端可互換性、和tensorflow更緊密整合、得到tensorflow其他組建更好支持、且符合keras標準的高層次API。
那keras和tf.keras到底有什麼異同呢?下面我們先看一下共同點,再看一下不同點。
keras和tf.keras的主要共同點:
- 基於同一個API:如果不使用tf.keras的特有特性(見下文)的話,模型搭建、訓練、和推斷的代碼應該是可以互換的。把
import keras
換成from tensorflow import keras
,所有功能都應該可以工作。反之則未必,因為tf.keras有一些keras不支持的特性,見下文。Google Brain組負責兩個代碼庫之間的同步,每個代碼庫的重要bug fix和新特性,只要是後端無關的,都會被同步到另一個代碼庫。
- 相同的JSON和HDF5模型序列化格式和語義。從一方用
model.to_json()
或model.save()
保存的模型,可以在另一方載入並以同一語義運行。TensorFlow的生態裡面那些支持HDF5或JSON格式的其他庫,比如TensorFlow.js,也同等支持keras和tf.keras保存的模型。
keras和tf.keras的主要差別:
- tf.keras全面支持tensorflow的eager execution模式。eager execution是TensorFlow未來首推的另一個主要特性,也和易用性有關。但是這個對於tf.keras的用戶有什麼影響呢?如果你只是使用
keras.Sequential()
或keras.Model()
的「樂高式」模型搭建API的話,這個沒有影響。Eager execution相對於graph mode的性能劣勢,通過tf.function的imperative-to-graph變換來彌補。但是你如果是要自己編寫模型內部的運算邏輯的話,結合eager execution和tf.keras.Model方便動態模型的編寫。下圖裡的代碼實例展示瞭如何用這個API來編寫一個動態RNN(圖片來源:https://twitter.com/fchollet/status/1052228463300493312?lang=en)。這樣寫相對於僅僅使用tensorflow的底層API的好處,在於可以使用`tf.keras.Model`類型所提供的fit()、predict()
等抽象。這個特性主要是面向做深度學習研究的用戶。