2

在代码中:

@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 打印)

4

2 回答 2

1

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

tf.function的官方文档中,它被提到为:

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

将该解释应用于您的示例,操作,out = x+5并将 tf.print存储在中,Graph而操作print不存储。

始终建议将Tensors参数作为参数传递给函数,而不是Python Scalars让所有操作都被捕获在单个图表中。

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

通常,建议创建有状态tf.Variable的对象,例如 outsidetf.function并将它们作为参数传递。

如果我们使用 PythonAssignment运算符,a = b, 将不是 Graph 的一部分,而是tf.assign。PythonPrint不会成为 Graph 的一部分,但tf.Print会。

此外,如果我们希望 Python 代码也成为 Graph 的一部分,我们可以tf.py_function在函数内部使用,但不建议这样做。

希望这可以帮助。快乐学习!!

于 2020-05-18T17:35:52.713 回答
1

正如前面的答案所解释的,只有tf.调用(操作)由 a 转换tf.function

tf.print("msg")要理解为什么,你应该想想用 python 程序编写意味着什么。它说:

  1. 定义一个做某事的 Tensorflow 操作(简称 op)。(在这种情况下,它打印为副作用,但实际结果并不重要)
  2. 运行。发生这种情况是因为在 TF2 中默认启用了急切执行。

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

要回答最近的疑问:

  1. 是的,numpy 数组和其他本机类型被视为张量,因为 TF 操作和函数(经过@tf.function修饰的 def)首先调用tf.convert_to_tensor它们的输入。
  2. 不,a=b没有记录,因为它只是将张量的引用从一个变量复制到另一个变量。分配不会转换张量。
于 2020-05-19T18:32:47.483 回答