在代码中:
@tf.function
def f(x):
print("Python execution: ", x)
out = x+5.
tf.print("Graph execution: ", x)
return outpython print仅在函数的第一次调用期间执行,即在图形创建期间执行。out=x+5.成为图表的一部分,因此每次图表运行时都会执行。我想知道当我用普通的python编写一个函数并用tf.function修饰它来绘制图形时,什么都能转换成图形(比如out = x+5),什么不能(比如python打印)。
发布于 2020-05-19 01:35:53
为了社区的利益,详细阐述了jdehesa的评论。
在tf.function的官方文档中,提到了:
Python关键点:任何
副作用(追加到列表、使用打印打印等)都只会在跟踪时发生一次。要将副作用执行到您的tf.function中,需要将它们编写为TF ops:
将这个解释应用到您的示例中,操作、out = x+5和tf.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,但不推荐这样做。
希望这能有所帮助。祝您学习愉快!
发布于 2020-05-20 02:32:47
正如前面的回答所解释的,tf.function只转换tf.调用(操作)。
要理解其中的原因,您应该考虑在python程序中编写tf.print("msg")意味着什么。上面写着:
从本质上讲,当您使用tf.function进行装饰时,您定义的所有操作都会被收集起来,并在以后重用。所以,没有定义Tensorflow操作的指令不能被Tensorflow记录。在您的示例中,+符号确实隐式定义了一个op,因为tf.function将x转换为张量,然后将其传递给f(x)。
要回答最近的疑虑:
@tf.function修饰的定义)首先在其输入上调用tf.convert_to_tensor。a=b不会被记录,因为它只是将张量的引用从一个变量复制到另一个变量。赋值不会转换张量。https://stackoverflow.com/questions/61750627
复制相似问题