紧跟未来深度学习框架需求,TensorFlow 推出 Eager Execution

Google 的 TensorFlow 是 AI 学习者中使用率最高、名气也最大的深度学习框架,但由于 TensorFlow 最早是基于 Google 的需求开发的,在实际使用上也会存在如 文档乱、调试难 等诸多缺点,而且开发时间比较早未能及时对一些新的需求进行反应(据AI研习社了解,由于缺乏类似 PyTroch、DyNet 的动态图功能,Lecun 就不止一次吐槽过 TensorFlow 是 “过时的深度学习框架”(yesterday deep learning framework)),而针对用户的需求,Google 也在对 TensorFlow 不断改进。

在 10 月 31 日,Google 为 TensorFlow 引入了动态图机制 Eager Execution,而 Google Brain Team 的工程师 Asim Shankar 和 Wolff Dobson 也在 Google 官方博客发文详细阐述了这一功能带来的变化,AI研习社摘编如下:

今天,我们为 TensorFlow 引入了 “Eager Execution”,它是一个命令式、由运行定义的接口,一旦从 Python 被调用可立即执行操作,这使得 TensorFlow 的入门学习变的更简单,也使得研发工作变得更直观。 Eager Execution 的优点包括:

  • 可以在即时的运行错误下进行快速调试,与 Python 工具进行整合
  • 通过易于使用的 Python 控制流支持动态模型
  • 为自定义和高阶梯度提供强大支持
  • 适用于几乎目前所有的 TensorFlow 操作

目前 Eager Execution 仍处于试用阶段,因此我们也在寻求来自社区的反馈以指导我们的方向。

同时 Google 还举了一些使用 Eager Execution 的直观例子,例如使用两个矩阵相乘的代码是这样编写的:

import tensorflow as tf import tensorflow.contrib.eager as tfe tfe.enable_eager_execution() x = [[2.]] m = tf.matmul(x, x)

使用 print 或者 Python 调试器检查中间结果也非常直接。

print(m) # The 1x1 matrix [[4.]]

梯度与自定义梯度

大多数 TensorFlow 用户对自动微分感兴趣。因为每次调用期间可能会产生不同的运算,因此我们将所有的正向运算录到一个 “磁带” 上,并在计算梯度时进行反向运算。计算了梯度之后,这个 “磁带” 就没用了。

这一 API 与 autograd 包非常类似,例子如下:

def square(x): return tf.multiply(x, x) grad = tfe.gradients_function(square) print(square(3.)) # [9.] print(grad(3.)) # [6.]

在这里,gradients_function 先调用了一个预先定义的 Python 函数 square() 作为参数,并返回一个 Python 可调用函数 grad 来计算相对于输入的 square() 的偏导数。如以上例子中当输入为 3.0 时, square() 的计算结果为 9,而 grad(3.0) 为对 square() 进行偏导,其计算结果为 6。

同样,我们也可以调用 gradient_function 计算 square 的二阶导数。

此外,用户也可能需要为运算或函数自定义梯度。这一功能可能有用,例如,它可以为一系列运算提供了更高效或者数值更稳定的梯度。

以下是一个自定义梯度的例子。我们先来看函数 log(1 + e^x),它通常用于计算交叉熵和对数似然。

def log1pexp(x): return tf.log(1 + tf.exp(x)) grad_log1pexp = tfe.gradients_function(log1pexp) # The gradient computation works fine at x = 0. print(grad_log1pexp(0.) )# [0.5] # However it returns a `nan` at x = 100 due to numerical instability.print(grad_log1pexp(100.)) # [nan]

上述例子中,当 x=0 时,梯度计算表现良好。然而由于数值的不稳定性,当 x=100 时则会返回 `nan` 。使用上述函数的自定义梯度可用于分析简化梯度表达式。

使用 Eager 和 Graphs

Eager execution 使开发和调试互动性更强,但是 TensorFlow graphs 在分布式训练、性能优化和生产部署中也有着诸多优势。

当启用 eager execution 时,执行运算的代码同时还可以构建一个描述 eager execution 未启用状况的计算图。要将模型转换成图形,只需在新的 Python 进程中运行同样的代码即可。这一做法可以从检查点保存和修复模型变量值,这允许我们在 eager(命令式)和 graph(声明式)编程之间轻松转换。通过这种方式可以轻松地将启用 eager execution 开发出的模型导出到生产部署中。

在不久的将来,我们将提供工具来选择性地将模型的某些部分转换为图形。这样就可以融合部分计算(如自定义 RNN 单元的内部),以实现高性能并同时保持 eager execution 的灵活性和可读性。

新功能势必带来代码编写上的变化。Google 还很贴心地给出了几个 Tips:

  • 与 TensorFlow 一样,我们建议,如果您还没有从队列切换到使用 tf.data 进行输入处理,请抓紧时间进行切换,它更容易使用,也会更快。 有关帮助参阅相关博客文章(http://t.cn/RpNiMIo)和文档页面(http://t.cn/Rl2azT8)。
  • 使用面向对象层,如 tf.layer.Conv2D()或 Keras 层;;它们可以直接存储变量。
  • 你可以为大多数模型编写代码,无论是执行和图形构建都是一样的。 但也有一些例外,例如使用 Python 控制流来改变基于输入的计算的动态模型。
  • 一旦你调用了 tfe.enable_eager_execution(),它就不能关闭。 要获取图形行为,请启动一个新的 Python 会话。

更多内容可参阅 Google 博客(http://t.cn/RlZizQ2)。

原文发布于微信公众号 - AI研习社(okweiwu)

原文发表时间:2017-11-03

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏慎独

Python科学计算和绘图入门

4074
来自专栏AI研习社

如何理解Nvidia英伟达的Multi-GPU多卡通信框架NCCL?

深度学习中常常需要多GPU并行训练,而Nvidia的NCCL库NVIDIA/nccl(https://github.com/NVIDIA/nccl)在各大深度学...

3729
来自专栏AI研习社

让 TensorFlow 估算器的推断提速百倍,我是怎么做到的?

TensorFlow 估算器提供了一套中阶 API 用于编写、训练与使用机器学习模型,尤其是深度学习模型。在这篇博文中,我们描述了如何通过使用异步执行来避免每次...

1242
来自专栏大数据挖掘DT机器学习

支持中文文本数据挖掘的开源项目PyMining

最近一个月,过年的时候天天在家里呆着,年后公司的事情也不断,有一段时间没有更新博客了。PyMining是我最近一段时间构思的一个项目,虽然目前看来比较微型。该项...

4126
来自专栏新智元

Kaggle放大招:简单几步实现海量数据分析及可视化

【新智元导读】近期,Kaggle发布了新的数据分析及可视化工具——Kaggle Kerneler bot,用户只需上传数据集,便可用Python为用户自动获取相...

1303
来自专栏吉浦迅科技

为啥在Matlab上用NVIDIA Titan V训练的速度没有GTX1080快?

在Matlab官方论坛上看到这个帖子,希望给大家带来参考 有一天,有人在Matlab的论坛上发出了求救帖: ? 楼主说: 我想要加快我的神经网络训练,所以把G...

5428
来自专栏AI科技评论

开发 | 如何理解Nvidia英伟达的Multi-GPU多卡通信框架NCCL?

问题详情: 深度学习中常常需要多GPU并行训 练,而Nvidia的NCCL库NVIDIA/nccl(https://github.com/NVIDIA/nccl...

4168
来自专栏智能算法

数据异常到底该如何检测?(一)

小编在正式进入工作之后,面对的第一个需要去解决的问题:在网络安全监测中,如何发现异常数据?如异常用户登录,异常操作等。对于网络上的问题我确实是第一次接触这样类型...

6187
来自专栏CDA数据分析师

工具 | Python 和 R 数据分析/挖掘工具互查

在此总结一些在数据分析/挖掘中可能用到的功能,方便大家索引或者从一种语言迁移到另一种。如果大家已经熟悉python和R的模块/包载入方式,那下面的表查找起来相对...

2377
来自专栏新智元

谷歌、亚马逊和百度的深度学习野心:TensorFlow、MXNet、PaddlePaddle 三大框架对比

【新智元导读】本文作者陈汝丹从定位、框架使用、分布式构成三个方面比较了 TensorFlow、MXNet、PaddlePaddle三个常用开源框架。 本文转载自...

3636

扫码关注云+社区

领取腾讯云代金券