首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在tensorflow 2中,什么会成为图表的一部分,什么不会?

在tensorflow 2中,什么会成为图表的一部分,什么不会?
EN

Stack Overflow用户
提问于 2020-05-12 19:31:54
回答 2查看 317关注 0票数 2

在代码中:

代码语言:javascript
复制
@tf.function
def f(x):
    print("Python execution: ", x)
    out = x+5.
    tf.print("Graph execution: ", x)
    return out

python print仅在函数的第一次调用期间执行,即在图形创建期间执行。out=x+5.成为图表的一部分,因此每次图表运行时都会执行。我想知道当我用普通的python编写一个函数并用tf.function修饰它来绘制图形时,什么都能转换成图形(比如out = x+5),什么不能(比如python打印)。

EN

回答 2

Stack Overflow用户

发布于 2020-05-19 01:35:53

为了社区的利益,详细阐述了jdehesa的评论。

tf.function的官方文档中,提到了:

Python关键点:任何

副作用(追加到列表、使用打印打印等)都只会在跟踪时发生一次。要将副作用执行到您的tf.function中,需要将它们编写为TF ops:

将这个解释应用到您的示例中,操作、out = x+5tf.print将存储在Graph中,而操作print不会。

总是建议将Tensors作为参数传递给函数,而不是Python Scalars,这样所有操作都将被捕获到单个图中。

tf.function只允许在第一次调用时创建新的tf.Variable对象。

通常,建议在tf.function外部创建像tf.Variable这样的有状态对象,并将它们作为参数传递。

如果我们使用Python运算符,a = b将不会是Assignment的一部分,而tf.assign将是。Python Print不会是图表的一部分,但tf.Print会是。

此外,如果我们想让Python Code也成为Graph的一部分,我们可以在函数中使用tf.py_function,但不推荐这样做。

希望这能有所帮助。祝您学习愉快!

票数 1
EN

Stack Overflow用户

发布于 2020-05-20 02:32:47

正如前面的回答所解释的,tf.function只转换tf.调用(操作)。

要理解其中的原因,您应该考虑在python程序中编写tf.print("msg")意味着什么。上面写着:

  1. Define是一个Tensorflow操作(简称op),它做了一些事情。(在本例中,它打印为副作用,但实际结果不是important)
  2. Run.发生这种情况是因为在TF2中默认启用了紧急执行。

从本质上讲,当您使用tf.function进行装饰时,您定义的所有操作都会被收集起来,并在以后重用。所以,没有定义Tensorflow操作的指令不能被Tensorflow记录。在您的示例中,+符号确实隐式定义了一个op,因为tf.functionx转换为张量,然后将其传递给f(x)

要回答最近的疑虑:

  1. 是,numpy数组和其他本机类型被视为张量,因为TF操作和函数( @tf.function修饰的定义)首先在其输入上调用tf.convert_to_tensor
  2. 否,a=b不会被记录,因为它只是将张量的引用从一个变量复制到另一个变量。赋值不会转换张量。
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/61750627

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档