Tensorflow团队早早就放出了风声,Tensorflow 2.0就快来了,这是一个重要的里程碑版本,重点放在简单和易用性上。我对Tensorflow 2.0的到来充满期待,因此翻译了这篇Tensorflow团队发布的文档:Effective TensorFlow 2.0: Best Practices and What’s Changed。原文地址:https://medium.com/tensorflow/effective-tensorflow-2-0-best-practices-and-whats-changed-a0ca48767aff ,略有删减。点击阅读原文可以跳转到该文章,需要翻墙哦!

在最近的一篇文章中,我们提到,TensorFlow 2.0经过重新设计,重点关注开发人员的工作效率、简单性和易用性。

要深入了解所改变的内容及应用最佳实践,请查看新的Effective TensorFlow 2.0指南(发布在GitHub上)。本文简要概述那份指南里的内容。如果您对这些主题感兴趣,请前往指南了解更多信息!

主要变化概述

TensorFlow 2.0中有许多变化可以提高用户的工作效率,包括删除冗余API、使API更加一致(统一的RNN、统一的优化器),以及Python运行时更好地集成Eager执行。

许多RFC(如果您对它们感到陌生,请查看它们!)已经解释了制定TensorFlow 2.0的变化和思考。本指南展现了在TensorFlow 2.0中开发应该是什么样的。前提假设您对TensorFlow 1.x有一定的了解。

API清理

许多API在TF 2.0中消失或改变位置,有些则被替换为等效的2.0版本 -- tf.summary、tf.keras.metrics和tf.keras.optimizers。自动替换为新方法的最简单方法是使用v2升级脚本。

Eager执行

TensorFlow 1.X要求用户调用tf.* API手动将抽象语法树(图)拼接在一起。 然后,用户需要通过将一组输出张量和输入张量传递给 session.run() 函数调用来手动编译抽象语法树。相比之下,TensorFlow 2.0立即执行(就像Python通常做的那样),在tf 2.0中,图形和会话感觉更像实现细节。

减少全局变量

TensorFlow 1.X严重依赖于隐式全局命名空间。调用 tf.Variable() 时,它会被放入默认图形中,它会保留在那里,即使忘记了指向它的Python变量。然后,您可以恢复该 tf.Variable ,但前提是您知道它已创建的名称。如果变量的创建不由您掌控,这就很难做到。结果,各种机制激增,试图帮助用户再次找到他们的变量。

TensorFlow 2.0取消了所有这些机制(Variables 2.0 RFC),启用默认机制:跟踪变量! 如果您失去了对 tf.Variable 的追踪,就会被垃圾回收。

函数,而不是会话

session.run() 调用几乎就像一个函数调用:指定输入和要调用的函数,然后返回一组输出。在TensorFlow 2.0中,您可以使用 tf.function() 来修饰Python函数以将其标记为JIT编译,使得TensorFlow将其作为单个图运行(Functions 2.0 RFC)。

这种机制允许TensorFlow 2.0获得图形模式的所有好处:

  • 性能:可以优化函数(节点修剪、内核融合等)
  • 可移植性:函数可以导出/重新导入(SavedModel 2.0 RFC),允许用户重用和共享模块化TensorFlow函数。

凭借自由分发Python和TensorFlow代码的能力,您可以充分利用Python的表现力。但是,便携式TensorFlow在没有Python解释器上下文时执行 - 移动、C++和JS。为了帮助用户避免在添加@tf.function时重写代码,* AutoGraph *会将部分Python构造转换为他们的TensorFlow等价物。

TensorFlow 2.0约定建议

将代码重构为更小的函数

TensorFlow 1.X中的常见使用模式是“水槽”策略,其中所有可能的计算的合集被预先排列,然后通过 session.run() 评估选择的张量。在TensorFlow 2.0中,用户应将其代码重构为较小的函数,这些函数根据需要调用。通常,没有必要用 tf.function 来修饰这些较小的函数,仅使用 tf.function 来修饰高级计算 - 例如,训练的一个步骤或模型的正向传递。

使用Keras图层和模型来管理变量

Keras模型和图层提供方便的变量和 trainable_variables 属性,以递归方式收集所有关联变量,这样可以轻松地将变量本地管理到它们的使用位置。

Keras层/模型继承自tf.train.Checkpointable并与@ tf.function集成,这使得直接获得检查点或从Keras对象导出SavedModel成为可能。您不一定要使用Keras's.fit()API来进行这些集成。

组合tf.data.Datasets和@tf.function

迭代加载到内存的训练数据时,可以随意使用常规的Python迭代。否则,tf.data.Dataset是从磁盘传输训练数据的最佳方式。数据集是可迭代的(不是迭代器),在Eager模式下和其他Python迭代一样工作。您可以通过将代码包装在tf.function()中来充分利用数据集异步预取/流特性,它会将Python迭代替换为使用AutoGraph的等效图形操作。

@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.condtf.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_celldef 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
复制代码

下一步

本文提供了Effective TF 2.0指南的简要(如果您对这些主题感兴趣,请到那里了解更多!)要了解有关TensorFlow 2.0的更多信息,我们还推荐这些近期文章:

  • 向TensorFlow提供贡献:SIG、RFC、测试和文档
  • 什么是TensorFlow 2.0中的符号和命令式API?
  • 标准化Keras:TensorFlow 2.0中的高级API指南

转载于:https://juejin.im/post/5c86723e6fb9a04a05408037

[译]高效的TensorFlow 2.0:应用最佳实践以及有什么变化相关推荐

  1. doodoo.js发布1.1.0 -- 中文最佳实践Node.js Web快速开发框架,支持Koa.js, Express.js中间件。包含多项功能改进,及Bug修复。...

    2019独角兽企业重金招聘Python工程师标准>>> doodoo.js发布1.1.0 -- 中文最佳实践Node.js Web快速开发框架,支持Koa.js, Express.j ...

  2. Logstash 2.2.0 的最佳实践

    目录 目录 基础知识 介绍 安装 Hello World 长期运行 配置语法 输入插件Input 标准输入Stdin 读取文件File 读取网络数据TCP 生成测试数据Generator 读取 Red ...

  3. angular 最佳实践_干净高效的Angular应用程序的最佳实践

    angular 最佳实践 by Vamsi Vempati 由Vamsi Vempati 干净高效的Angular应用程序的最佳实践 (Best practices for a clean and p ...

  4. css 倒三角_【译】改善 CSS 的 10 个最佳实践

    CSS 看起来是一种非常直接且不易犯错的语言.只需要添加规则以对网站进行样式设置就可以了,对吗?对于只需要几个 CSS 文件的小型站点,可能是这种情况.但是在大型程序中,这样可能会使样式迅速失控.如何 ...

  5. 【译】LiveData-Flow在MVVM中的最佳实践

    点击上方蓝字关注我,知识会给你力量 最近在Medium上看到了Flow开发者写的几篇文章,觉得很不错,推荐给大家. 1 原文链接:https://proandroiddev.com/using-liv ...

  6. 蚂蚁集团TRaaS技术风险防控平台入选中国信通院《信息系统稳定性保障能力建设指南(1.0)》最佳实践案例

    近日,中国信息通信研究院分布式系统稳定性实验室正式发布了<信息系统稳定性保障能力建设指南>(以下简称<指南>).蚂蚁集团应邀深度参与了<指南>的研讨编制,该指南收录 ...

  7. vue2.0 keep-alive最佳实践

    1.基本用法 vue2.0提供了一个keep-alive组件 用来缓存组件,避免多次加载相应的组件,减少性能消耗 <keep-alive> <component><!-- ...

  8. TensorFlow 2.0 beta版本来了!

    在不知不觉中,TensorFlow 2.0 beta版本已经发布,你可以通过下述方法安装: 或安装GPU版本: pip install tensorflow-gpu==2.0.0-beta0 在此测试 ...

  9. TensorFlow 2.0 发布以来,又有哪些最新进展?| AI ProCon 2020

    [导读]7 月 3-4 日,由 CSDN 主办的第三届 AI 开发者大会(AI ProCon 2020)在线上举行.本次大会有超万人报名参与,参与人群覆盖 50+ 领域.4000 家企业.其中有来自行 ...

最新文章

  1. ScrollPic.js——图片左右滚动插件
  2. CVPR 2020 运行SGMN遇到的问题及解决办法
  3. sklearn常用模块
  4. Ticket Game CodeForces - 1215D(博弈题,巴什博弈思维)
  5. 剑指Offer - 面试题45. 把数组排成最小的数(字符串排序)
  6. bzoj1176: [Balkan2007]Mokia cdq
  7. 03_KNN_统计学习方法
  8. 质数分布是否随机关乎安全大事
  9. 由浅入深学习Apache httpd原理与配置
  10. Windows Live Writer
  11. sql server高可用_SQL Server 2019常规可用性和安装概述
  12. 【扯淡】今天看了《写给失眠者的心理学》,下面开始借鉴与脑洞大开
  13. HDU3782 xxx定律【数学计算+水题】
  14. pbewithmd5anddes算法 对应.net_常用插值算法详解
  15. SPFA和FLOYD算法如何打印路径
  16. Struts2入门教程(学习教程资料).pdf
  17. 计算机室nb代码,NB-iot SDK源码(Linux版)
  18. 【Android病毒分析报告】- 手机支付毒王“银行悍匪”的前世今生
  19. python语言在ansys的应用_Python语言在ANSYS的应用10讲-掌握SCDM脚本封装及ACT向导开发...
  20. GoogleVoice群发WhatsApp翻译谷歌语音消息自动群发

热门文章

  1. js 、jq强化复习
  2. 论一名项目经理的能力素养
  3. Linux 管理员手册(2)
  4. Spring(三)AOP面向切面编程
  5. Java类的连接与初始化 (及2013阿里初始化笔试题解析)
  6. android开发技术博客
  7. H3C   ISIS与BGP 路由配置
  8. 为什么自动化对于IT工程师是必须的?
  9. LSASRV事件ID:40960
  10. TCP/IP、SOCKET、HTTP之间的联系与区别