可以通过tf.function
和autograph.to_graph
获得相似的结果。
但是,这似乎取决于版本。
例如,功能(摘自官方指南):
def square_if_positive(x):
if x > 0:
x = x * x
else:
x = 0.0
return x
可以使用以下方式在图形模式下进行评估:
autograph.to_graph
tf_square_if_positive = autograph.to_graph(square_if_positive)
with tf.Graph().as_default():
g_out = tf_square_if_positive(tf.constant( 9.0))
with tf.Session() as sess:
print(sess.run(g_out))
tf.function
@tf.function
def square_if_positive(x):
if x > 0:
x = x * x
else:
x = 0.0
return x
square_if_positive(tf.constant( 9.0))
所以:
tf.function
和autograph.to_graph
之间是什么关系?可以假设tf.function
在内部使用autograph.to_graph
(以及autograph.to_code
),但这远非显而易见。autograph.to_graph
代码段(因为它需要tf.Session
)?它出现在TF 1.14的autograph doc中,但没有出现在TF 2.0的相应文档中答案 0 :(得分:4)
我在由三部分组成的文章中涵盖并回答了您的所有问题:“分析tf.function以发现AutoGraph的优势和精妙之处”:part 1,part 2,part 3。
总结并回答您的3个问题:
tf.function
和autograph.to_graph
之间是什么关系? tf.function
默认使用AutoGraph。当您第一次
if
的哪个分支,等等。上)tf.*
调用,即它知道的Python语句(while
-> tf.while
,if
-> {{ 1}},...)-。合并来自第1点和第2点的信息,将创建一个新图,并根据函数名称和参数类型将其缓存在映射中(有关详细信息,请参阅文章)。
是的,tf.autograph.to_graph
仍然存在,它在内部为您创建了一个会话(在TF2中,您不必担心它们)。
无论如何,我建议您阅读链接的三篇文章,因为它们详细介绍了tf.cond
的这一点和其他特点。
答案 1 :(得分:1)
@nessuno的回答非常好,对我有很大帮助。而实际上,文档tf.autograph.to_graph直接解释了autograpsh和tf.funciton之间的关系:
与tf.function不同,to_graph是将Python代码转换为TensorFlow图形代码的低级编译器。它不执行任何缓存,变量管理或创建任何实际操作,并且最好用于需要对生成的TensorFlow图进行更大控制的位置。与tf.function的另一个区别是to_graph不会将图形包装为TensorFlow函数或Python可调用。在内部,tf.function使用to_graph。