0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

一项名为“AutoGraph”的TensorFlow新功能

Tensorflowers 来源:未知 作者:李倩 2018-08-15 11:07 次阅读

今天,我们将介绍一项名为 “AutoGraph” 的 TensorFlow 新功能。AutoGraph 可以将 Python 代码(包括控制流、print() 和其他 Python 原生功能)转换为纯 TensorFlow 图代码。

要在不使用即时执行的情况下编写 TensorFlow 代码,您需要进行一些元编程,即编写一个用于创建图的程序,然后再执行该图。这种方式可能会令人困惑,特别是对于新开发者而言。一些特别棘手的情况涉及更复杂的模型,例如使用 if 和 while 的模型,或者具有 print() 等副作用或接受结构化输入的模型。

那么,我们为什么需要图呢?图允许各种优化,如移除常见的子表达式和融合内核。此外,由于图形成了一种独立于平台的计算模型,可简化分布式训练和针对各种环境的部署。这对于多个 GPU 或 TPU 上的分布式训练或者通过TensorFlow Lite在移动或物联网等其他平台上分发模型尤为重要。

下面这个简单示例显示了您可能要添加到图的运算:

1def huber_loss(a):

2if tf.abs(a) <= delta:    

3loss = a * a / 2

4else:

5loss = delta * (tf.abs(a) - delta / 2)

6return loss

如果使用即时执行,也可以满足要求,但是由于 Python 解释器开销或错过程序优化机会,这样可能会很慢。

要准备好执行图,您需要进行重写以使用类似 tf.cond() 的语句,但这可能比较繁琐并且难以实现。AutoGraph 可以为您自动执行此转换,既保持了即时编程的简易性,同时又获得了图执行的性能优势。

在本例中,我们可以使用 autograph.convert() 装饰函数,AutoGraph 将自动生成可生成图的代码。

使用 AutoGraph 时,由于装饰器的原因,以下代码:

1@autograph.convert()

2def huber_loss(a):

3if tf.abs(a) <= delta:    

4loss = a * a / 2

5else:

6loss = delta * (tf.abs(a) - delta / 2)

7return loss

在执行时变为以下代码。

1def tf__huber_loss(a):

2with tf.name_scope('huber_loss'):

3

4def if_true():

5with tf.name_scope('if_true'):

6loss = a * a / 2

7 return loss,

8

9def if_false():

10with tf.name_scope('if_false'):

11 loss = delta * (tf.abs(a) - delta / 2)

12 return loss,

13 loss = ag__.utils.run_cond(tf.less_equal(tf.abs(a), delta), if_true,

14if_false)

15 return loss

然后,您可以将这些代码视为 TensorFlow 运算进行调用:

1with tf.Graph().as_default():

2x_tensor = tf.constant(9.0)

3

4# The converted function works like a regular op: tensors in, tensors out.

5huber_loss_tensor = huber_loss(x_tensor)

6

7with tf.Session() as sess:

8print('TensorFlow result: %2.2f\n' % sess.run(huber_loss_tensor))

如您所见,AutoGraph 填补了即时执行与图之间的差距。AutoGraph 接收即时风格的 Python 代码并将其转换为生成图的代码。

AutoGraph 不仅仅是一组有用的宏,它还使用源代码转换来允许替换 Python 语言的任意部分,包括控制流、函数应用和赋值、生成模板代码,以及重构惯用 Python 以便轻松转换成图。

使用任何编译器,都会对错误消息的可读性产生担忧;为此,AutoGraph 设置为创建错误消息和堆叠追踪,以显示原始源代码中的错误源,而不是仅显示对生成代码的引用。

可运行示例

那么,AutoGraph 可以为我们做什么呢?以下是一些代码示例,现在可以直接转换为图代码而无需任何更改。如果您想实际运行所有这些操作,我们提供了一个笔记本,您可以在Colab中打开或在GitHub中查看。

注:GitHub 链接https://github.com/tensorflow/models/blob/master/samples/core/guide/autograph.ipynb

接下来,我们使用循环和分支来检查Collatz 猜想。请注意,出于多样性考虑,我们将不使用装饰器,而使用 AutoGraph 的 .to_graph() 函数将其转换为图。

1def collatz(a):

2counter = 0

3while a != 1:

4if a % 2 == 0:

5a = a // 2

6else:

7a = 3 * a + 1

8counter = counter + 1

9return counter

10

11graph_mode_collatz = autograph.to_graph(collatz)

12# The code is human-readable, too

13print(autograph.to_code(collatz))

14

15collatz_tensor = graph_mode_collatz(tf.constant(n))

AutoGraph 可以支持任意的嵌套控制流,例如:

1def f(n):

2if n >= 0:

3while n < 5:    

4n += 1

5print(n)

6return n

AutoGraph 允许在循环内向数组追加元素。为此,我们将使用一些 AutoGraph 辅助工具,set_element_type 和 stack。

1def f(n):

2z = []

3# We ask you to tell us the element dtype of the list

4autograph.set_element_type(z, tf.int32)

5for i in range(n):

6z.append(i)

7# when you're done with the list, stack it

8# (this is just like np.stack)

9return autograph.stack(z)

我们还支持 break、continue,甚至 print 和 assert 等语句。转换后,此代码段的 Python assert 转换为使用适当的 tf.Assert 的图。

1def f(x):

2assert x != 0, 'Do not pass zero!'

3return x * x

能够轻松向图添加循环和控制流等,这意味着可以轻松将训练循环转移到图中。您可以在此笔记本中找到相关示例,其中,我们接受一个 RNN 训练循环并用一个 sess.run() 调用执行。在需要将整个训练循环传递给加速器而不是通过 CPU 控制器管理训练的情况下,这样做十分有用。

注:笔记本链接

https://colab.research.google.com/github/tensorflow/models/blob/master/samples/core/guide/autograph.ipynb#scrollTo=4LfnJjm0Bm0B

AutoGraph 开启了构建和训练模型的新思路。我们期待根据开发者社区的建议为 AutoGraph 添加更多功能,因此欢迎您提交问题并给出建议!

图性能与即时执行

即时执行非常简单易用,但图的速度通常要更快。虽然二者的比较基准较为复杂(并且取决于应用和硬件配置),但在这个简单的示例中,我们可以看到,从即时切换到大量使用 if 和 while 的 AutoGraph 代码时,速度有了显著提升。

最终,AutoGraph 允许您在加速器硬件(如 GPU 和Cloud TPU)上使用动态和流控制较多的模型,这在基于大量数据训练大型模型时十分必要。

我们刚刚开始着手分析性能。如果您发现某个图语句的运行速度低于预期,请提交问题!

AutoGraph 和即时执行

虽然使用即时执行时,您仍然可以通过tf.contrib.eager.defun对部分代码使用图执行,但这要求您使用 tf.cond() 等 TensorFlow 图运算。将来,AutoGraph 将与 defun 无缝集成,允许用简单的即时式 Python 语言编写图代码。实现此功能后,您可以通过选择性地将即时代码转换为图片段来使用 AutoGraph 加速热点。

结论

AutoGraph 是一款新工具,可帮您轻松构建能够在 TensorFlow 图中轻松运行的直观、复杂的模型。此工具目前为 contrib 中的实验性工具,但我们希望尽快将它加入到核心 TensorFlow 中。

跟我们分享您的 AutoGraph 使用体验!如果您有任何反馈、建议或想法,请提交问题并向TensorFlow 开发者群组发送消息。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • 物联网
    +关注

    关注

    2866

    文章

    41549

    浏览量

    358118
  • tensorflow
    +关注

    关注

    13

    文章

    313

    浏览量

    60241

原文标题:AutoGraph 将 Python 转换为 TensorFlow 图

文章出处:【微信号:tensorflowers,微信公众号:Tensorflowers】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    下图中的与打开文件相连的枚举常量是自己一项一项编辑...

    下图中的与打开文件相连的枚举常量是自己一项一项编辑的还是自动就有的?
    发表于 03-17 21:39

    大二学生发明×××,填补一项空白

    经常看到大二学生发明×××,填补一项空白,好像人才辈出?实际上全是假的,这些人搞的发明既不实用,又不是什么新理论,骗钱的骗名誉的。科技部也不管管,国企的电动汽车项目全都不能超过国外,既然科研目标达不到,还搞科研做什么?应当规定,凡是科研目标达不到的,就不拨款。已经拨款的,责任设计师下岗!
    发表于 09-29 22:26

    51单片机的个引脚是否只能执行一项功能

    51单片机的个引脚是否只能执行一项功能?比如说,控制蜂鸣器的引脚如果用来控制蜂鸣器的话,还可以用作其他的功能来控制其他元件吗?单片机控制步进电机时,可以另外用电源给步进电机供电吗?还
    发表于 06-22 18:03

    如何读取下拉列表中的某一项

    现在我做的是个查询的功能,通过下拉列表的选项来选择相应的文件,但是不知道怎样读取所选择的那一项例如选择了粮仓3湿度,2016/11/4日,要打开相应的数据文件
    发表于 11-08 21:33

    我的一项节能发明,应该如何推广

    我的一项节能发明,不知应该如何推广,请大师们指点,视频连接地址:https://v.youku.com/v_show/id_XMzk1MTY4NTkzNg==.html?spm=a2h0k.11417342.soresults.dposter不足之处请指出谢谢
    发表于 12-06 20:12

    DropDown小工具不知道当前选择的是哪一项

    DropDown小工具的API就这么多,真不知道那个函数能返回当前选择的是哪一项,就算是返回选择的索引的函数也没有,都不知道当前选择的是哪一项,那这个DropDown小工具还有什么用,难道只能做出来当摆设,看了例程也没有用它选择的是哪
    发表于 03-09 23:06

    请教Ring控件删除最后一项

    请问:Ring控件,删除其下拉内容最后一项,显示不正常(如显示为:),怎样纠正?
    发表于 04-12 17:09

    TensorFlow的特点和基本的操作方式

    2015年11月在GitHub上开源,在2016年4月补充了分布式版本,最新版本为1.10,2018年下半年将发布Tensorflow 2.0预览版。Tensorflow目前仍处于快速开发迭代中,不断推出新功能和优化性能,现已成
    发表于 11-23 09:56

    关于电机驱动原理的动画,哪位大佬可以分享一项吗?

    关于电机驱动原理的动画,哪位大佬可以分享一项吗?
    发表于 10-13 06:17

    捷豹F-Pace展开一项名为GLOSA的V2X功能测试

    捷豹路虎集团近日宣布,已在其旗下的捷豹F-Pace车型展开一项名为GLOSA的V2X功能测试,GLOSA全称为Green Light Optimal Speed Advisory,从其命名可得知,该系统并不会介入车辆的控制,仅提
    的头像 发表于 11-22 10:17 5177次阅读

    特斯拉打盹模式新功能,可设置闹钟和空调系统

    据外媒报道,特斯拉车主很快就能享受到一项名为“打盹模式”(Nap Mode)的新功能,这项新功能近期将通过车机软件OTA更新推送给车主。
    的头像 发表于 01-02 17:07 6469次阅读

    Facebook正在测试一项名为“校园”的新功能

    据报道,Facebook正在测试一项名为“校园”的新功能,大学生可以使用其大学ID登录并与大学中的其他人建立联系。学生可以写下他们的预期毕业年份,专业和辅修学位,甚至还可以输入宿舍编号以与他人联系。
    的头像 发表于 04-22 14:26 1595次阅读

    Netflix向电话应用程序添加了一项新功能

    最近,Netflix向电话应用程序添加了一项新功能,可让您锁定屏幕。这些新的屏幕锁定控件有助于防止您不小心跳到节目或电影的上一个或下一个部分。
    的头像 发表于 04-23 14:39 1677次阅读

    WhatsApp正在开发一项新功能

    WhatsApp正在开发一项新功能,该功能将使用户能够共享消失得无影无踪的媒体文件。本周,我们将了解有关此功能的更多详细信息。对于初学者来说,即将到期的媒体
    的头像 发表于 09-30 10:22 1620次阅读

    TensorFlow 2.4来了 带来了多项新特性和功能改进

    谷歌正式发布了 TensorFlow 2.4,带来了多项新特性和功能改进。   TensorFlow 2.4 的更新包括对于分布式训练和混合精度的新功能支持,对 NumPy API 子
    的头像 发表于 12-26 11:38 2331次阅读