Tensorflow中的tf.function和autograph.to_graph之间是什么关系?

时间:2019-08-16 14:13:02

标签: python tensorflow tensorflow2.0

可以通过tf.functionautograph.to_graph获得相似的结果。
但是,这似乎取决于版本。

例如,功能(摘自官方指南):

def square_if_positive(x):
  if x > 0:
    x = x * x
  else:
    x = 0.0
  return x

可以使用以下方式在图形模式下进行评估:

    TF 1.14中的
  • 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))
    TF2.0中的
  • 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.functionautograph.to_graph之间是什么关系?可以假设tf.function在内部使用autograph.to_graph(以及autograph.to_code),但这远非显而易见。
  • TF2.0是否仍支持autograph.to_graph代码段(因为它需要tf.Session)?它出现在TF 1.14的autograph doc中,但没有出现在TF 2.0的相应文档中

2 个答案:

答案 0 :(得分:4)

我在由三部分组成的文章中涵盖并回答了您的所有问题:“分析tf.function以发现AutoGraph的优势和精妙之处”:part 1part 2part 3

总结并回答您的3个问题:

  • tf.functionautograph.to_graph之间是什么关系?

tf.function默认使用AutoGraph。当您第一次装饰功能时,会发生以下情况:

  1. 执行函数主体(类似于TensorFlow 1.x,因此无需急切模式),并跟踪其执行(现在tf.function知道存在哪些节点,保留if的哪个分支,等等。上)
  2. 同时,AutoGraph启动并尝试转换为tf.*调用,即它知道的Python语句(while-> tf.whileif-> {{ 1}},...)-。

合并来自第1点和第2点的信息,将创建一个新图,并根据函数名称和参数类型将其缓存在映射中(有关详细信息,请参阅文章)。

  • TF2.0仍支持autograph.to_graph代码段吗?

是的,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。