我们等候的TensorFlow 2.0尚有哪些变革?
副问题[/!--empirenews.page--]
为进步 TensorFlow 的事变服从,TensorFlow 2.0 举办了多项变动,包罗删除了多余的 API,使API 越发同等同一,譬喻同一的 RNNs (轮回神经收集),同一的优化器,而且Python 运行时更好地集成了 Eager execution 。 很多 RFC 已经对 TensorFlow 2.0 的这些变动给出了表明。本指南基于您对 TensorFlow 1.x 有必然的相识的条件,为您先容在 TensorFlow 2.0 中的开拓有什么差异。 API 清算 在 TensorFlow 2.0 中,有很多 1.X 的 API 被删除或移动 了。也有部门 1.X 的 API 被 2.0 版本的等价 API 所更换:tf.summary,tf.keras.metrics 和 tf.keras.optimizers。自动应用这些重定名,最简朴的要领是行使 TensorFlow 2.0 进级剧本。 Eager execution TensorFlow 1.X 要求用户通过挪用 tf.* API 手动的将抽象语法树(图)拼接在一路。然后,它要求用户将一组输出张量和输入张量转达给 session.run() 挪用,来手动编译抽象语法树。对比之下,TensorFlow 2.0 executes eagerly(如正常行使 Python 一样)在 2.0 的版本中,其 graphs(抽象语法树)和 sessions 在实现的细节上应该是一样的。 不再有全局变量 TensorFlow 1.X 很是依靠于隐式全局定名空间。当你挪用 tf.Variable 时,它会被放入默认图中,纵然你健忘了指向它的 Python 变量它也会留在哪里。这时,您可以规复该 tf.Variable(),但条件是您得知道它已建设的名称。假如您无法节制变量的建设,很难做到这一点。因此,各类机制以及探求用户建设变量的框架不绝涌现,试图辅佐用户再次找到他们的变量。 TensorFlow 2.0 打消了全部这些机制(Variables 2.0 RFC),支持默认机制:跟踪变量! 假如你不再用到某个 tf.Variable,它就会被接纳。 Functions, not sessions session.run() 的挪用险些相同于函数挪用:指定输入和要挪用的函数,然后返回一组输出。在 TensorFlow 2.0 中,您可以行使 tf.function() 来修饰 Python 函数以将其标志为 JIT( Just-In-Time )编译,以便 TensorFlow 将其作为单个图运行(Functions 2.0 RFC)。 这种机制使得 TensorFlow 2.0 拥有图模式的很多利益:
# TensorFlow 1.X outputs = session.run(f(placeholder), feed_dict={placeholder: input})# TensorFlow 2.0 outputs = f(input) 因为可以或许自由地穿插 Python 和 TensorFlow 代码,您可以或许充实操作 Python 的示意力。并且,可移植的 TensorFlow 在没有 Python 表明器的环境下也可执行。好比:mobile,C ++ 和 JS。停止用户在添加 @tf.function 时重写代码,AutoGraph 会将 Python 结构的一个子集转换成 TensorFlow 等价物。 TensorFlow 2.0 常用的提议 将代码重构为更小的函数 TensorFlow 1.X 中的常见行使模式是 “kitchen sink” 计策,即预先列出全部也许计较的并集,然后通过 session.run() 计较选定的张量。在 TensorFlow 2.0 中,用户应该按照需求将代码重构为更小的函数。凡是环境下,没有须要用 tf.function 来修饰这些较小的函数;仅行使 tf.function 来修饰高级计较 — 譬喻,行使只有一个步调的实习或行使模子的正向转达,将代码重构为更小的函数。 行使 Keras 层和模子来打点变量 Keras 模子和层提供了利便的变量和 trainable_variables 属性,以递归方法网络全部因变量。这使适合地化打点变量很是利便。 Keras 层 / 模子担任自 tf.train.Checkpointable 并与 @ tf.function 集成,这使得直接搜查点或从 Keras 工具导出 SavedModel 成为也许。您不必然要行使 Keras 的 fit() API 来集成。 团结 tf.data.Datasets 和 @tf.function 在迭代得当内存的实习数据时,可以行使通例的 Python 轮回。除此之外,tf.data.Dataset 则是从磁盘传输实习数据的最好要领。数据集是可迭代的(不是迭代器),事变方法与其他 Python 轮回相同。假如您想行使 AutoGraph 的等效图操纵替代 Python 轮回,可以通过将代码包装在 tf.function() 中,充实操作数据集异步预取 / 流成果来实现。 @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) 操作 AutoGraph 和 Python 节制流程 AutoGraph 提供了一种将依靠于数据的节制流转换为图模式等价的要领,如 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 有关具体信息,请参阅文末链接: https://github.com/tensorflow/docs/blob/master/site/en/r2/guide/effective_tf2.md (编辑:湖南网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |