为了提高TensorFlow的工作效率,TensorFlow2.0做了很多改变,包括删除冗余的API,让API更加一致和统一,比如统一RNNs(循环神经网络)、统一优化器、Python运行时Eagerexecution更好地集成。已经给出了许多RFC来解释TensorFlow2.0中的这些变化。本指南在您对TensorFlow1.x有一定了解的前提下,向您介绍在TensorFlow2.0中开发时的不同之处。API在TensorFlow2.0中进行了组织,许多1.XAPI已被删除或移动。还有一些1.XAPI已被等效的2.0API取代:tf.summary、tf.keras.metrics和tf.keras.optimizers。自动应用这些重命名的最简单方法是使用TensorFlow2.0升级脚本。EagerexecutionTensorFlow1.X要求用户通过调用tf.*API手动将抽象语法树(图)拼接在一起。然后,它要求用户通过将一组输出张量和输入张量传递给session.run()调用来手动编译抽象语法树。相比之下,TensorFlow2.0在2.0版本中是eagerlyexecute(就像正常使用Python一样),其graphs(抽象语法树)和session在实现细节上应该是相同的。不再有全局变量TensorFlow1.X严重依赖隐式全局命名空间。当您调用tf.Variable时,它??会被放入默认图中,即使您忘记了指向它的Python变量,它也会保留在那里。此时,您可以恢复tf.Variable(),但前提是您知道创建它时使用的名称。如果您无法控制变量的创建,则很难做到这一点。因此,出现了各种用于查找用户创建的变量的机制和框架,试图帮助用户再次找到他们的变量。TensorFlow2.0取消了所有这些机制(Variables2.0RFC)以支持默认机制:跟踪变量!如果您不再需要tf.Variable,它将被回收。函数,而不是会话session.run()的调用几乎就像一个函数调用:您指定输入和要调用的函数,然后返回一组输出。在TensorFlow2.0中,您可以使用tf.function()修饰Python函数,将其标记为JIT(即时)编译,以便TensorFlow将其作为单个图运行(Functions2.0RFC)。这种机制使得TensorFlow2.0拥有图模式的诸多优势:性能:函数可以优化,例如节点剪枝、内核融合等可移植性:函数可以导出/重新导入(SavedModel2.0RFC),允许用户reuse和TensorFlow函数作为模块共享#TensorFlow1.Xoutputs=session.run(f(placeholder),feed_dict={placeholder:input})#TensorFlow2.0outputs=f(input)由于可以自由穿插Python和TensorFlow代码,你可以充分利用Python的表现力。此外,可移植的TensorFlow无需Python解释器即可执行。例如:移动、C++和JS。为避免用户在添加@tf.function时重写代码,AutoGraph会将Python构造的子集转换为TensorFlow等效项。TensorFlow2.0中的一个常见建议是将代码重构为更小的函数。TensorFlow1.X中一个常见的使用模式是“kitchensink”策略,它预先列出所有可能计算的并集,然后通过session.run()给定张量计算选择。在TensorFlow2.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.functiondeftrain(model,dataset,optimizer):forx,yindataset:withtf.GradientTape()astape: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单元,允许您静态或动态展开递归神经网络。为了演示,您可以按如下方式重新实现动态展开:):#[批次、时间、特征]->[时间、批次、特征]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)foriintf.range(input_data.shape[0]):output,state=self.cell(input_data[i],state)outputs=outputs.write(i,output)returntf.transpose(outputs.stack(),[1,0,2]),state使用tf.metrics聚合数据,使用tf.summary记录数据A完整的tf.summary接口集即将发布。您可以使用以下命令访问2.0版本的tf.summary:fromtensorflow.python.opsimportsummary_ops_v2更多信息,请参见文末链接:https://github.com/tensorflow/docs/blob/master/site/en/r2/guide/effective_tf2.md
