2019 年 2 月 13 日 - TensorFlow 团队发布
在 最近的一篇文章 中,我们提到了 TensorFlow 2.0 经过重新设计,侧重于开发人员的生产力、简化性和易用性。
要更详细地了解发生了哪些变化,以及了解最佳实践,请查看新的 TensorFlow 2.0 实用指南(发布在 GitHub 上)。本文提供了您将在其中找到的内容的简要摘要。如果这些主题中的任何一个让您感兴趣,请前往指南了解更多信息!
tf.summary
,tf.keras.metrics
和 tf.keras.optimizers
。自动应用这些重命名最简单的方法是使用 v2 升级脚本。session.run()
调用来手动编译抽象语法树。相比之下,TensorFlow 2.0 以 eager 的方式执行(就像 Python 通常做的那样),在 2.0 中,图形和会话应该感觉像是实现细节。tf.Variable()
时,它将被放入默认图形中,并且它将保留在那里,即使您丢失了指向它的 Python 变量。然后,您可以恢复该 tf.Variable
,但前提是您知道它创建时使用的名称。如果您无法控制变量的创建,这将很难做到。因此,各种机制层出不穷,试图帮助用户再次找到他们的变量。tf.Variable
,它将被垃圾回收。有关更多详细信息,请参阅 指南。session.run()
调用几乎就像函数调用一样:您指定输入和要调用的函数,然后您将获得一组输出。在 TensorFlow 2.0 中,您可以使用 tf.function()
装饰 Python 函数,将其标记为 JIT 编译,以便 TensorFlow 将其作为单个图形运行(函数 2.0 RFC)。@tf.function
时不得不重写代码,AutoGraph 将转换 Python 结构的子集,使其成为 TensorFlow 等效项。有关更多详细信息,请参阅 指南。
session.run()
评估选定的张量。在 TensorFlow 2.0 中,用户应该将代码重构为更小的函数,这些函数根据需要被调用。通常情况下,没有必要使用 tf.function
装饰这些较小的函数;仅当您需要装饰高级计算时才使用 tf.function
- 例如,训练的一步,或您模型的前向传播。tf.train.Checkpointable
并与 @tf.function
集成,这使得可以从 Keras 对象直接检查点或导出 SavedModels。您不一定要使用 Keras’s.fit()
API 来利用这些集成。有关更多详细信息,请参阅 指南。
tf.data.Datasets
和 @tf.function
结合起来tf.data.Dataset
是从磁盘流式传输训练数据的最佳方式。数据集是 可迭代的(不是迭代器),并且在 Eager 模式下就像其他 Python 可迭代对象一样工作。通过将代码包装在 tf.function()
中,您可以充分利用数据集异步预取/流式传输功能,这将使用 AutoGraph 将 Python 迭代替换为等效的图形操作。@tf.function
def train(model, dataset, optimizer):
for x, y in dataset:
with tf.GradientTape() as tape:
prediction = model(x)
loss = loss_fn(prediction, y)
gradients = tape.gradients(loss, model.trainable_variables)
optimizer.apply_gradients(gradients, model.trainable_variables)
如果您使用 Keras .fit()
API,您将不必担心数据集迭代。model.compile(optimizer=optimizer, loss=loss_fn)
model.fit(dataset)
tf.cond
和 tf.while_loop
。数据依赖的控制流出现的一个常见地方是在序列模型中。tf.keras.layers.RNN
包装了一个 RNN 单元,允许您静态或动态地展开递归。为了说明,您可以按照如下方式重新实现动态展开
class DynamicRNN(tf.keras.Model):
def __init__(self, rnn_cell):
super(DynamicRNN, self).__init__(self)
self.cell = rnn_cell
def call(self, input_data):
# [batch, time, features] -> [time, batch, features]
input_data = tf.transpose(input_data, [1, 0, 2])
outputs = tf.TensorArray(tf.float32, input_data.shape[0])
state = self.cell.zero_state(input_data.shape[1], dtype=tf.float32)
for i in tf.range(input_data.shape[0]):
output, state = self.cell(input_data[i], state)
outputs = outputs.write(i, output)
return tf.transpose(outputs.stack(), [1, 0, 2]), state
有关更多详细信息,请参阅 指南。tf.metrics
聚合数据,并使用 tf.summary
记录数据tf.summary
符号即将推出。您可以通过以下方式访问 tf.summary
的 2.0 版本from tensorflow.python.ops import summary_ops_v2
有关更多详细信息,请参阅 指南。
2019 年 2 月 13 日 - TensorFlow 团队发布
在 最近的一篇文章 中,我们提到了 TensorFlow 2.0 经过重新设计,侧重于开发人员的生产力、简化性和易用性。
要更详细地了解发生了哪些变化,以及了解最佳实践,请查看新的 TensorFlow 2.0 实用指南(发布在 GitHub 上)。本文提供了您将在其中找到的内容的简要摘要。如果任何…