(谢邀。利益相关: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/


推荐阅读:
相关文章