(謝邀。利益相關: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的主要共同點:

  1. 基於同一個API:如果不使用tf.keras的特有特性(見下文)的話,模型搭建、訓練、和推斷的代碼應該是可以互換的。把import keras 換成from tensorflow import keras,所有功能都應該可以工作。反之則未必,因為tf.keras有一些keras不支持的特性,見下文。Google Brain組負責兩個代碼庫之間的同步,每個代碼庫的重要bug fix和新特性,只要是後端無關的,都會被同步到另一個代碼庫。
  2. 相同的JSON和HDF5模型序列化格式和語義。從一方用model.to_json() 或model.save()保存的模型,可以在另一方載入並以同一語義運行。TensorFlow的生態裡面那些支持HDF5或JSON格式的其他庫,比如TensorFlow.js,也同等支持keras和tf.keras保存的模型。

keras和tf.keras的主要差別:

  1. 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()等抽象。這個特性主要是面向做深度學習研究的用戶。

2. tf.keras支持基於tf.data的模型訓練。tf.data是TensorFlow自2017年初左右推出的新特性。由於基於lazy範式、使用了多線程數據輸入管路,tf.data可以顯著提高模型訓練的效率,同時降低數據相關的代碼的複雜性。tf.data帶來的性能提高,對於TPU訓練來說至關重要。tf.keras.Mode.fit()直接支持tf.data.Dataset iterator對象作為輸入參數。比如這個MNIST訓練例子:

https://gist.github.com/datlife/abfe263803691a8864b7a2d4f87c4ab8?

gist.github.com

3. tf.keras支持TPU訓練。TPU是Google自己研發的深度學習模型訓練加速硬體,現在在很多訓練任務上持有State of the art的性能。用戶可以用`tf.contrib.tpu.keras_to_tpu_model()`將一個tf.keras.Model對象轉換成一個可以在TPU上進行訓練的模型對象。見以下例子:

https://colab.sandbox.google.com/github/tensorflow/tpu/blob/master/tools/colab/fashion_mnist.ipynb?

colab.sandbox.google.com

4. tf.keras支持tf.distribution裡面的DistributionStrategy進行多GPU或多機分散式訓練。tf.distribution是tensorflow裡面比較新的API,提供一套易用的分散式訓練的抽象,幫助用戶實現多卡或多機模型訓練。比如,keras用戶應該知道,普通版的keras是不支持多GPU訓練的。tf.keras可以克服這一侷限,詳見官方文檔裡面的例子:

https://www.tensorflow.org/guide/distribute_strategy#example_with_keras_api?

www.tensorflow.org

5. tf.keras的其他特有特性:

  • tf.keras.models.model_to_estimator() :將模型轉換成estimator對象 。見文檔。
  • tf.contrib.saved_model.save_keras_model():將模型保存為tensorflow的SavedModel格式。見文檔。

那我應該選擇keras還是tf.keras呢?

  • 如果你需要任何一個上述tf.keras的特有特性的話,那當然應該選擇tf.keras。
  • 如果後端可互換性對你很重要的話,那選擇keras。
  • 如果以上兩條對你都不重要的話,那選用哪個都可以。

希望以上有幫助。

————————

勘誤和增補:

  1. 關於上面差異第4點:keras也支持多GPU訓練,但是基於一個不同的API:keras.utils.multi_gpu_model


大佬答題在前,我就再囉嗦其中一點吧,

需要tpu運算一定一定一定要記得使用tf.keras

不要問我背後的故事


tf.keras和keras差異還是有的,只能說tf.keras更與tensorflow結合更新,所以也更多地支持tensorflow的新特性,另外tensorflow2中,tf.keras做了很多重要升級,比如optimizer和metric等等。


tf.keras 和 keras哪一個速度更快?


請教一個問題:

我想在TPU / TensorFlow 2.1.0上面訓練MaskRCNN模型,但目前網上只有改模型的keras實現(我使用的是:fizyr/keras-maskrcnn),代碼運行後,只能生成一個keras.Model的模型,如下:

model = create_mrcnn_model(**kw)

model

Out[3]: &

並非是tf.keras.Model,導致訓練的時候出現很多兼容性的問題。

有沒有什麼簡便方法將keras.Model轉換為tf.keras.Model?還是需要我將整個maskrcnn項目都移植到tf.keras上面?

@shanicky @蔡善清 @小小將


感覺沒什麼區別,我一般都用tf.keras


keras和現在TensorFlow2.0結合的不錯,這個tf.keras介面就是佐證,http://nooverfit.com/wp/3%e7%a7%8d%e7%94%a8keras%e5%92%8ctensorflow2-0%e5%88%9b%e5%bb%ba%e6%a8%a1%e5%9e%8b%e7%9a%84%e6%96%b9%e6%b3%95%ef%bc%9a%e5%ba%8f%e5%88%97%e6%a8%a1%e5%9e%8b%ef%bc%8c%e5%87%bd%e6%95%b0%e5%bc%8f%e6%a8%a1/


推薦閱讀:
相關文章