来源 | Google TensorFlow 团队

为提高 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 拥有图模式的许多优点:

  • 性能:该函数可以被优化,例如节点修剪,内核融合等

  • 可移植性:该函数可以导出 / 重新导入(SavedModel 2.0 RFC),允许用户重用和将 TensorFlow 函数作为模块共享

# 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

(本文仅代表作者观点,转载请联系原作者)

精彩推荐

推荐阅读:

  • 对标Bert?刷屏的GPT 2.0意味着什么

  • 一次性掌握机器学习基础知识脉络 | 公开课笔记

  • Python助你抢红包

  • 3分钟实现9种经典排序算法的可视化|Python

  • 骗局翻新, 暗网活跃度倍增, 2018加密货币犯罪报告敢看吗?

  • 云漫圈 | 学Python还是Java, 8张漫画带你全面分析

  • 35 岁程序员,年后第一天被辞退

  • 手机辐射排行榜:小米、一加远超 iPhone;阿里开工彩票最高奖金 1000 万;苹果再遭集体诉讼

  • 2月报告:Python逆袭成功?踢馆Java,碾压C++!

点击“阅读原文”,打开CSDN APP 阅读更贴心。

我们期待的TensorFlow 2.0还有哪些变化?相关推荐

  1. [译]高效的TensorFlow 2.0:应用最佳实践以及有什么变化

    Tensorflow团队早早就放出了风声,Tensorflow 2.0就快来了,这是一个重要的里程碑版本,重点放在简单和易用性上.我对Tensorflow 2.0的到来充满期待,因此翻译了这篇Tens ...

  2. Keras vs tf.keras: 在TensorFlow 2.0中有什么区别?

    导读 在本文中,您将发现Keras和tf.keras之间的区别,包括TensorFlow 2.0中的新增功能. 万众期待的TensorFlow 2.0于9月30日正式发布. 虽然肯定是值得庆祝的时刻, ...

  3. Keras vs. tf.keras: 在TensorFlow 2.0中有什么区别?

    在本教程中,您将发现Keras和tf.keras之间的区别,包括TensorFlow 2.0中的新增功能. Keras vs. tf.keras: 在TensorFlow 2.0中有什么区别? htt ...

  4. 代码实例:如何使用 TensorFlow 2.0 Preview

    去年8月13日,谷歌宣布 "TensorFlow 2.0 is coming", 最近几天,谷歌 TensorFlow 团队刚刚发布了 TensorFlow 2.0 Preview ...

  5. TensorFlow 2.0发布在即,高级API变化抢先看

    作者 | Sandeep Gupta, Josh Gordon, and Karmel Allison 整理 | 非主流.Jane 出品 | AI科技大本营 [导语]早在今年 8 月的时候,谷歌开源战 ...

  6. 重磅 | TensorFlow 2.0即将发布,所有tf.contrib将被弃用

    作者 | 阿司匹林 出品 | AI科技大本营(公众号ID:rgznai100) 上周,谷歌刚刚发布了 TensorFlow 1.10.0 版本(详见<TensorFlow 版本 1.10.0 发 ...

  7. TensorFlow tfjs 0.10.3 发布

    翻译 | 王柯凝 出品 | AI科技大本营(公众号ID:rgznai100) TensorFlow tfjs 0.10.3 近日正式发布,新版本主要有以下改进内容,AI科技大本营对其编译如下. ▌资源 ...

  8. TensorFlow 1.0 正式发布 你需要知道的都在这里

    谷歌表示,仅仅在发布的第一年里,TensorFlow 就帮助研究人员.工程师.艺术家.学生以及其他行业人员取得了巨大研究进展.这包括机器翻译.早期皮肤癌检测.防止糖尿病失明并发症等诸多领域.如今,Te ...

  9. 标准化Keras:TensorFlow 2.0中的高级API指南

    TensorFlow正准备发布2.0版本 . 在本文中,我们希望预览TensorFlow的高级API标题的方向,并回答一些常见问题. Keras是一个非常受欢迎的高级API,用于构建和培训深度学习模型 ...

最新文章

  1. 最近又Get个新技能,不是全栈也能用技术倒腾点东西赚零花钱了!
  2. 计算机地址栏搜索不了网,我的电脑地址栏不见了怎么办 地址栏不见了如何解决...
  3. 《统一沟通-微软-实战》-3-部署-Exchange 2010-2-自定义安装
  4. 两个局域网如何互联_如何申请使用三大航司的机上wifi服务?
  5. 上海市消保委:春节长假期间 共受理消费者投诉4600件
  6. python创建透明窗体_python – PyQt5:使用不透明的子项创建半透明窗口
  7. 面对疫情等群体性危机,程序员如何在家高效办公?
  8. 每天CookBook之Python-005
  9. Flutter学习 — 给新页面传值
  10. Redis学习之路(二)之Redis入门基础
  11. mongodb 集合操作 (增删改查)
  12. Android 小组件完整案例
  13. [历朝通俗演义-蔡东藩-前汉]第011回 降真龙光韬泗水 斩大蛇夜走丰乡
  14. 百度Q3财报公布,O2O转型志在必得
  15. HTML 随机点名 --个人写法
  16. (ROS)Moveit编程示例
  17. htc系统Android 7.1,这款HTC太强大,被誉为刷机之王,一路升到安卓7.1
  18. 【Git】1090- 我在工作中是如何使用Git的
  19. METI备案申请详细流程与简介
  20. 双十二大家都在买哪些书?这份书单请码住

热门文章

  1. 新建silverlight项目提示未将对象设置到实例解决方案
  2. Jquery获取选中行的某个数据
  3. Java Day01-2
  4. 【转】ubuntu下实用的三款录屏软件
  5. poj2289二分图多重匹配
  6. codeforce843B Interactive LowerBound
  7. [BZOJ 1002] [FJOI 2007] 轮状病毒
  8. ZOJ 2110 Tempter of the Bone(DFS)
  9. 不雅测发挥分析Android在美智能机市场凌驾黑莓及苹果
  10. 对象***已断开连接或不在该服务器上 的解决方案之一