在 Keras 上标准化:TensorFlow 2.0 中高级 API 指南
2018 年 12 月 6 日
Sandeep GuptaJosh GordonKarmel Allison 代表 TensorFlow 团队发布

TensorFlow 正在准备 发布 2.0 版本。在本文中,我们想预览 TensorFlow 高级 API 的发展方向,并回答一些常见问题。

Keras 是一个非常流行的高级 API,用于构建和训练深度学习模型。它被用于快速原型设计、最先进的研究和生产。虽然 TensorFlow 今天支持 Keras,但随着 2.0 的发布,我们将 Keras 更紧密地集成到 TensorFlow 平台的其余部分。

通过将 Keras 确立为 TensorFlow 的高级 API,我们使机器学习新手更容易上手使用 TensorFlow。单个高级 API 减少了混淆,使我们能够专注于为研究人员提供高级功能。

我们希望您会像我们一样喜欢使用它!

Keras 有几个关键优势
  • 用户友好:Keras 具有简单、一致的界面,针对常见用例进行了优化。它为用户错误提供了清晰可行的反馈,以及易于理解的错误消息,通常还附带了一些有用的建议。
  • 模块化且可组合:Keras 模型是通过将可配置的构建块组合在一起而构建的,几乎没有限制。Keras 的部分可以重复使用,而无需采用或了解框架提供的全部内容。例如,您可以使用层或优化器,而无需使用 Keras 模型 进行训练。
  • 易于扩展:您可以编写自定义构建块来表达新的研究理念,包括新的层、损失函数和 [在此处插入您的想法],以开发最先进的想法。
  • 适用于初学者和专家:深度学习开发人员来自不同的背景和经验水平,Keras 提供了有用的 API,无论您是刚开始学习还是已经拥有多年的经验。
这些功能共同简化了工作流程,并提高了从学习 ML 到研究、应用开发到部署的各种用例的生产效率。
首先,我们将回答一些出现过的问题。接下来,我们将仔细看看 TensorFlow 附带的 Keras 版本能够让您做什么。

常见问题解答

我一直认为 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 特定的增强功能。这些包括对 急切执行 的支持,以实现直观的调试和快速迭代,对 TensorFlow SavedModel 模型交换格式的支持,以及对分布式训练的集成支持,包括在 TPU 上进行训练。急切执行在使用 tf.keras 模型子类化 API 时特别有用。这个 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 笔记本中运行
!pip install tensorflow
import tensorflow as tf
Dense = tf.keras.layers.Dense
您现在将使用 tf.keras。如果您不熟悉导入,可以查看一些最新的 教程 以获取示例。

您提到 TensorFlow 为初学者和专家提供不同的 API 风格。这些风格是什么样的?

TensorFlow 开发人员拥有多种经验水平(从第一次学习 ML 的学生到 ML 专家和研究人员)。同样,TensorFlow 的优势之一是它提供了几种 API 来支持不同的工作流和目标。同样,TensorFlow 的 Keras 集成的主要设计目标是用户可以挑选和选择他们认为更有益的 Keras 部分,而无需采用整个框架。

顺序 API

单击 此处 以获取在几行代码中训练第一个神经网络的示例。
定义模型最常用的方法是构建一个层图,这对应于我们通常在思考深度学习时使用的思维模型。最简单的模型类型是层堆栈。您可以使用顺序 API 来定义这样的模型,如下所示
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)
您可以在 tensorflow.org/tutorials 上的“学习和使用 ML”部分找到更多使用顺序 API 的示例。
单击 此处 以获取一个教程,该教程将引导您使用顺序 API 在 Fashion MNIST 数据集上训练您的第一个神经网络。

函数式 API

当然,顺序模型只是一个简单的层堆栈,它不能表示任意模型。可以使用 函数式 API 构建更高级的模型,它使您能够定义复杂的拓扑结构,包括多输入和多输出模型、共享层的模型以及具有残差连接的模型。

使用函数式 API 构建模型时,层是可调用的(在一个张量上),并返回一个张量作为输出。然后可以使用这些输入张量和输出张量来定义模型。例如
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)
可以使用上面相同的简单命令来编译和训练这样的模型。您可以在 此处 了解有关函数式 API 的更多信息。

模型子类化 API

可以使用 模型子类化 API 构建完全可自定义的模型。在这种风格中,您以命令式的方式在类方法的正文中定义自己的正向传递。例如
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)
这些模型更加灵活,但可能更难调试。所有三种类型的模型都可以使用前面显示的简单编译和拟合命令进行编译和训练,或者您可以编写自己的自定义训练循环来进行完全控制。

例如
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))
有关模型子类化风格的更多示例,请查看下面的链接,或访问 tensorflow.org/tutorials(查看“研究和实验”部分)。
带注意力的神经机器翻译 使用模型子类化 API 实现
使用模型子类化 API 实现的 GAN

如果我的研究不适合这些风格怎么办?

如果您发现 tf.keras 对您的应用领域有限制,您有很多选择。您可以
  • 单独使用 tf.keras.layers,而不是 Keras 模型定义,并编写自己的梯度和训练代码。
    您可以类似地单独独立地使用 tf.keras.optimizers、tf.keras.initializers、tf.keras.losses 或 tf.keras.metrics。
  • 完全忽略 tf.keras,并使用低级 TensorFlow、Python 和 AutoGraph 来获得您想要的结果。
完全由您决定!请注意,tf.layers 中的非面向对象层将被弃用,tf.contrib.*(包括高级 API,例如 tf.contrib.slim 和 tf.contrib.learn)在 TF 2.0 中将不可用。

估算器会怎样?

估算器 在 Google 内部和更广泛的 TensorFlow 社区中被广泛使用。许多模型已被打包为 预制估算器,包括线性分类器、DNN 分类器、组合 DNN 线性分类器(也称为广泛和深度模型)和梯度提升树。这些模型已准备好投入生产并被广泛部署,出于所有这些原因,估算器 API(包括预制估算器)将包含在 TensorFlow 2.0 中。

对于预制 Estimators 的用户来说,新版本对 Keras 和 Eager Execution 的关注不会带来太大的影响。我们可能会更改预制 Estimators 的实现方式,但会保持 API 表面不变。我们还会着手为预制 Estimators 中实现的模型添加 Keras 版本,并扩展 Keras 以更好地满足大型生产需求。

也就是说,如果您正在使用自定义架构,我们建议您使用 tf.keras 来构建模型,而不是 Estimator。如果您正在使用需要 Estimators 的基础设施,可以使用 model_to_estimator() 将您的模型进行转换,同时我们会努力确保 Keras 在 TensorFlow 生态系统中正常运行。

让我们一起迈向 TensorFlow 2.0!

我们希望您能像我们一样享受使用 tf.keras 的乐趣!在接下来的几个月里,TensorFlow 团队将专注于提升开发人员体验。我们的文档和教程将反映这一方向。我们期待您的想法和反馈(查看我们的 社区资源),以及您通过 GitHub 问题和 PR 进行的贡献。感谢大家!
下一篇
Standardizing on Keras: Guidance on High-level APIs in TensorFlow 2.0

Sandeep GuptaJosh GordonKarmel Allison 代表 TensorFlow 团队发布

TensorFlow 正在为 发布 2.0 版本 做准备。在这篇文章中,我们想预览 TensorFlow 高级 API 的发展方向,并回答一些常见问题。

Keras 是一个非常流行的用于构建和训练深度学习模型的高级 API。它被用于快速原型…