(谢邀。利益相关: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()
等抽象。这个特性主要是面向做深度学习研究的用户。