TensorFlow 正在为2.0 版的发布做准备。在本文中,我们想预览 TensorFlow 的高级 API 的发展方向,并回答一些常见问题。
Keras是一个非常流行的高级 API,用于构建和训练深度学习模型。它用于快速原型设计、最先进的研究和生产。虽然 TensorFlow 现在支持 Keras,但在 2.0 中,我们正在将 Keras 更紧密地集成到 TensorFlow 平台的其余部分中。
通过将 Keras 建立为 TensorFlow 的高级 API,我们让刚接触机器学习的开发人员更容易开始使用 TensorFlow。单一的高级 API 可以减少混淆,使我们能够专注于为研究人员提供高级功能。
我们希望您会像我们一样喜欢使用它!
Keras 有几个关键优势:
用户友好: Keras 具有针对常见用例优化的简单、一致的界面。它为用户错误提供清晰且可操作的反馈,以及易于理解的错误消息,通常提供有用的建议。模块化和可组合: Keras 模型是通过将可配置的构建块连接在一起制成的,几乎没有限制。部分 Keras 可以重复使用,而无需采用甚至了解框架提供的所有内容。例如,您可以在不使用 KerasModel进行训练的情况下使用层或优化器。易于扩展:您可以编写自定义构建块来表达新的研究想法,包括新层、损失函数,以及 [在此处插入您的想法] 以开发最先进的想法。对于初学者和专家:深度学习开发人员来自多种背景和经验水平,无论您是刚起步还是拥有多年经验,Keras 都提供有用的 API。
总之,这些使工作流在广泛的用例中变得更容易、更高效,从学习 ML 到研究,到应用程序开发,再到部署。
首先,我们将回答出现的几个问题。接下来,我们将详细了解 TensorFlow 附带的 Keras 版本可以让您做什么。
1、常问问题 1.1 我以为 Keras 是一个单独的库?最重要的是,Keras 是一个 API 规范。Keras的参考实现作为一个独立的开源项目进行维护,您可以在www.keras.io找到该项目。该项目独立于 TensorFlow,并拥有活跃的贡献者和用户社区。TensorFlow 包含 Keras API 的完整实现(在tf.keras模块中)以及 TensorFlow 特定的增强功能。
1.2 Keras 只是 TensorFlow 或其他库的包装器吗?不,这是一个常见的(但可以理解的)误解。Keras 是用于定义和训练机器学习模型的API 标准。Keras 不依赖于特定的实现:Keras API 具有 TensorFlow、MXNet、Typescript、Javascript、CNTK、Theano、PlaidML、Scala、CoreML 和其他库的实现。
1.3 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 中开发模型)。特征列,用于有效地表示和分类结构化数据。还有更多的作品。 1.4 如何安装 tf.keras?我还需要通过 pip 安装 Keras 吗?
tf.keras 包含在 TensorFlow 中。您不需要单独安装 Keras。例如,如果在Colab笔记本中运行:
!pip install tensorflowimport tensorflow as tfDense = tf.keras.layers.Dense
您现在将使用 tf.keras。如果您不熟悉导入,可以查看最近的一些教程以获取示例。
1.5 您提到 TensorFlow 为初学者和专家提供了不同的 API 样式。这些看起来怎么样?TensorFlow 开发人员有许多经验级别(从第一次学习 ML 的学生,到 ML 专家和研究人员)。同样,TensorFlow 的优势之一是它提供了多个 API 来支持不同的工作流程和目标。同样,TensorFlow 的 Keras 集成的主要设计目标是,用户可以选择 Keras 的部分,他们可以从中受益,而无需采用整个框架。
1.6 Sequential顺序 API如果您是学习 ML 的学生,我们建议您开始使用 tf.keras API。它直观、简洁,适用于实践中 95% 的 ML 问题。使用此 API,您可以用大约 10 行代码编写您的第一个神经网络。
定义模型的最常见方法是构建层图,这对应于我们在考虑深度学习时通常使用的心智模型。最简单的模型类型是一堆层。您可以使用 Sequential 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”部分下找到更多使用 Sequential 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)
可以使用上述相同的简单命令来编译和训练这样的模型
1.8 模型子类化 API可以使用Model Subclassing 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.*(包括 tf.contrib.slim 和 tf.contrib.learn 等高级 API)在 TF 2.0 中将不可用。
1.10 Estimators估算器会发生什么?估算器在 Google 以及更广泛的 TensorFlow 社区中都被广泛使用。几个模型已被打包为预制估计器,包括线性分类器、DNN 分类器、组合 DNN 线性分类器(又名宽和深模型)和梯度提升树。这些模型已准备好生产并广泛部署,出于所有这些原因,包括 Premade Estimator 在内的 Estimator API 将包含在 TensorFlow 2.0 中。
对于 Premade Estimators 的用户来说,对 Keras 和急切执行的新关注的影响将是最小的。我们可能会更改 Premade Estimators 的实现,同时保持 API 表面不变。我们还将努力添加作为预制估计器实现的模型的 Keras 版本,我们将扩展 Keras 以更好地满足大规模生产需求。
也就是说,如果您正在使用自定义架构,我们建议使用 tf.keras 来构建您的模型,而不是 Estimator。如果您正在使用需要 Estimator 的基础设施,您可以使用model_to_estimator()来转换您的模型,同时我们努力确保 Keras 在整个 TensorFlow 生态系统中工作。
1.11 迈向 TensorFlow 2.0!我们希望您会像我们一样喜欢使用 tf.keras!在接下来的几个月里,TensorFlow 团队将专注于完善开发者体验。我们的文档和教程将反映此路径。我们期待您的想法和反馈(查看我们的社区资源),以及通过 GitHub 问题和 PR 做出的贡献。感谢大家!
参考https://medium.com/tensorflow/standardizing-on-keras-guidance-on-high-level-apis-in-tensorflow-2-0-bad2b04c819a