Tensorflow 2.0带来的一个重大变化就是采用keras API作为TensorFlow的标准上层API,因为我在编码中使用到keras比较多,所以对这个变化感到高兴,现翻译一篇Tensorflow团队发布的文档:Standardizing on Keras: Guidance on High-level APIs in TensorFlow 2.0。原文地址:https://medium.com/tensorflow/standardizing-on-keras-guidance-on-high-level-apis-in-tensorflow-2-0-bad2b04c819a ,略有删减。点击阅读原文可以跳转到该文章,需要访问外国网站哦!
Keras是一个非常受欢迎的构建和训练深度学习模型的高级API。它用于快速原型设计、最前沿的研究以及产品中。虽然现在的TensorFlow已经支持Keras,在2.0中,我们将Keras更紧密地集成到TensorFlow平台。
将Keras作为TensorFlow的高级API,使得新的机器学习开发人员更容易开始使用TensorFlow。单一的高级API可以减少混乱,让我们能够专注于为研究人员提供高级功能。
我们希望您能像我们一样喜欢使用它!
Keras有几个关键优势:
- 用户友好:Keras拥有为常见使用场景特别优化的简单、一致的接口。它为用户错误提供了清晰且可操作的反馈,以及易于理解的错误消息,并且通常提供有用的建议。
- 模块化和可组合:Keras模型将可配置的构建块连接在一起,几乎没有限制。无需使用框架甚至不了解框架提供的所有内容的情况下,Keras的部件也可以重复使用。例如,您可以使用图层或优化器而无需使用Keras Model 进行训练。
- 易于扩展:您可以编写自定义构建块来表达新的研究想法,包括新的图层、损失函数和[在此插入您的想法]以开发最先进的想法。
- 针对初学者和专家:深度学习开发人员具有不同的背景和经验水平,而Keras提供了有用的API,无论您刚刚开始,还是拥有多年的经验。
综上,这些可以在更广泛的使用场景,从学习ML到研究、到应用程序开发、到部署,实现更轻松,更高效的工作流程。
首先,我们将回答几个问题。接下来,我们将仔细研究TensorFlow附带的Keras版本能够做到的事情。
FAQ
我以为Keras是一个单独的库?
首先,Keras是一个API规范。Keras的参考实现是作为独立的开源项目维护的,您可以在www.keras.io上找到它。该项目独立于TensorFlow,并拥有一个活跃的贡献者和用户社区。TensorFlow包含Keras API的完整实现(在tf.keras模块中),并有一些TensorFlow特有的增强功能。
Keras只是TensorFlow或其他库的包装器吗?
不,这是一个常见的(但可以理解的)误解。Keras是一个用于定义和训练机器学习模型的API标准。 Keras与特定实现无关:Keras API具有TensorFlow、MXNet、TypeScript、JavaScript、CNTK、Theano、PlaidML、Scala、CoreML和其他库的实现。
内置于TensorFlow的Keras版本与我在keras.io上可以找到的版本有什么区别?
TensorFlow包含Keras API(在tf.keras模块中)的实现,并有一些TensorFlow特定的增强功能,包括支持直观调试和快速迭代的eager execution,支持TensorFlow SavedModel模型交换格式,以及对分布式训练的集成支持,包括在TPU上训练。
使用tf.keras模型子类API时,eager execution特别有用。此API的灵感来自Chainer,使您能够强制性地编写模型的正向传递。tf.keras紧密集成在TensorFlow生态系统中,还包括对以下支持:
- tf.data,使您能够构建高性能输入管道。如果您愿意,可以使用NumPy格式的数据训练模型,或出于扩展和性能考虑,使用tf.data进行训练。
- 分发策略,用于在各种计算配置中分发训练,包括分布在许多计算机上的GPU和TPU。
- 导出模型。使用tf.keras API创建的模型可以序列化为TensorFlow SavedModel格式,可用TensorFlow Serving部署或用其他语言绑定(Java,Go,Rust,C#等)提供服务。
- 导出的模型可以部署在使用TensorFlow Lite的移动和嵌入式设备上,也可用于TensorFlow.js(注意:您也可以使用相同的Keras API直接在JavaScript中开发模型)。
- 特性列,用于有效地表示和分类结构化数据。
- 还有更多。
我该如何安装tf.keras?我还需要通过pip安装Keras吗?
tf.keras包含在TensorFlow中。您无需单独安装Keras。例如,如果在Colab Notebook中运行:
代码语言:javascript复制
!pip install tensorflow
import tensorflow as tf
Dense = tf.keras.layers.Dense
您就用上了tf.keras。如果您还不熟悉导入,可以查看一些最近的教程以获取示例。
您提到TensorFlow为初学者和专家提供不同样式的API。看起来怎么样?
TensorFlow开发人员具有有多种经验水平(从第一次学习ML的学生到ML专家和研究人员)。而TensorFlow的优势之一是它提供了多种API来支持不同的工作流程和目标。同样,这也是TensorFlow Keras集成的主要设计目标,用户可以选择Keras的一部分,而不必采用整个框架。
Sequential API
如果您是学习ML的学生,我们建议您开始时使用tf.keras Sequential API。它直观、简洁,适用于实践中95%的ML问题。使用此API,您可以用大约10行代码编写出第一个神经网络。
定义模型的最常用方法是构建图层图,最简单的模型类型是层的堆叠。您可以使用Sequential API定义这样的模型,如下所示:
代码语言:javascript复制
model = tf.keras.Sequential()
model.add(layers.Dense(64, activation=’relu’))
model.add(layers.Dense(64, activation=’relu’))
model.add(layers.Dense(10, activation=’softmax’))
Such a model can then be compiled and trained in a few lines:
model.compile(optimizer=’adam’,
loss=’sparse_categorical_crossentropy’,
metrics=[‘accuracy’])
model.fit(x_train, y_train, epochs=5)
model.evaluate(x_test, y_test)
您可以在“学习和使用ML”部分的tensorflow.org/tutorials上找到更多的使用Sequential API的示例。
单击此处获取教程,该教程将引导您使用Sequential API在Fashion MNIST数据集上训练您的第一个神经网络。
Functional API
当然,序列模型是一种简单的图层堆叠,不能表示任意模型。使用Functional API可以构建更高级的模型,使您可以定义复杂的拓扑,包括多输入和多输出模型,具有共享层的模型以及具有残差连接的模型。
在使用Functional API构建模型时,图层是可以调用(在张量上)的,并返回张量作为输出。然后可以使用这些输入张量和输出张量来定义模型。例如:
代码语言:javascript复制
inputs = tf.keras.Input(shape=(32,))
# A layer instance is callable on a tensor, and returns a tensor.
x = layers.Dense(64, activation=’relu’)(inputs)
x = layers.Dense(64, activation=’relu’)(x)
predictions = layers.Dense(10, activation=’softmax’)(x)
# Instantiate the model given inputs and outputs.
model = tf.keras.Model(inputs=inputs, outputs=predictions)
可以使用如上那样简单的命令来编译和训练这样的模型。您可以在此处了解有关Functional API的更多信息。
Model Subclassing API
使用Model Subclassing API可以构建完全可自定义的模型,您可以在类方法的主体中以此样式强制定义自己的前向传递。 例如:
代码语言:javascript复制
class MyModel(tf.keras.Model):
def __init__(self):
super(MyModel, self).__init__()
# Define your layers here.
self.dense_1 = layers.Dense(32, activation=’relu’)
self.dense_2 = layers.Dense(num_classes, activation=’sigmoid’)
def call(self, inputs):
# Define your forward pass here,
# using layers you previously defined in `__init__`
x = self.dense_1(inputs)
return self.dense_2(x)
这些模型更灵活,但可能更难调试。可以使用前面显示的简单编译和拟合命令编译和训练所有三种类型的模型,或者您可以编写自己的自定义训练循环以进行完全控制。
例如:
代码语言:javascript复制
model = MyModel()
with tf.GradientTape() as tape:
logits = model(images, training=True)
loss_value = loss(logits, labels)
grads = tape.gradient(loss_value, model.variables)
optimizer.apply_gradients(zip(grads, model.variables))
有关Model Subclassing样式的更多示例,请访问tensorflow.org/tutorials(请参阅“研究和实验”部分)。
使用Model Subclassing API实现的Neural Machine Translation with Attention
使用Model Subclassing API实现的GAN
如果我的研究不适合这些风格怎么办?
如果您发现tf.keras限制了你的应用领域,您有很多选择。您可以:
- 将tf.keras.layers与Keras模型定义分开使用,编写自己的梯度和训练代码。您可以单独和独立地使用tf.keras.optimizers,tf.keras.initializers,tf.keras.losses或tf.keras.metrics。
- 完全忽略tf.keras,使用低级TensorFlow API,Python和AutoGraph来达到你的目标。
这完全取决于您!请注意,tf.layers中的非面向对象的层将被废弃,并且tf.contrib.*(包括tf.contrib.slim和tf.contrib.learn等高级API)将在TF 2.0中不可用。
Estimators会发生什么变化?
Estimators广泛用于Google以及范围更广的TensorFlow社区。几种模型已被打包为Premade Estimators,包括线性分类器、DNN分类器、组合DNN线性分类器(又名Wide and Deep Models)和Gradient Boosted Trees。这些模型已经用于产品并得到广泛部署,由于所有这些原因,Estimator API(包括Premade Estimators)将包含在TensorFlow 2.0中。
对于Premade Estimators的用户来说,广受关注的Keras和eager execution对其影响将是微乎其微的。我们可能会更改Premade Estimators的实现,但会保持API接口相同。我们还将努力添加Premade Estimators实现的Keras版本,而且我们将扩展Keras以更好地满足大规模产品要求。
也就是说,如果您正在开发自定义架构,我们建议使用tf.keras来构建模型而不是Estimator。如果您正在使用需要Estimators的基础架构,您可以使用model_to_estimator()来转换模型,同时确保Keras工作在TensorFlow生态系统中。