Tensorflow 中的“tf.function”和“autograph.to_graph”有什么关系?

What is the relationship between `tf.function` and `autograph.to_graph` in Tensorflow?

通过 tf.functionautograph.to_graph 可以获得类似的结果。
然而,这似乎与版本有关。

例如函数(摘自官方指南):

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

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

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
def square_if_positive(x):
  if x > 0:
    x = x * x
  else:
    x = 0.0
  return x

square_if_positive(tf.constant( 9.0))

所以:

我在一篇分为三部分的文章中涵盖并回答了您的所有问题:"Analyzing tf.function to discover AutoGraph strengths and subtleties":part 1, part 2, part 3

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

  • tf.functionautograph.to_graph有什么关系?

tf.function 默认使用 AutoGraph。当你第一次 调用 一个 tf.function 装饰函数时会发生什么:

  1. 函数体被执行(在 TensorFlow 1.x 中,因此没有急切模式)并跟踪其执行(现在 tf.function 知道存在哪些节点,[=13] 的哪个分支=] 保留等等)
  2. 同时,AutoGraph 启动并尝试转换为 tf.* 调用,它知道的 Python 语句 (while -> tf.while, if -> tf.cond, ...)-.

合并第 1 点和第 2 点的信息,构建一个新图,并根据函数名称和参数类型将其缓存在地图中(请参阅文章以获得更好的理解)。

  • autograph.to_graph 片段在 TF2.0 中是否仍然受支持?

是的,tf.autograph.to_graph 仍然存在,它会在内部为您创建一个会话(在 TF2 中您不必担心它们)。

无论如何,我建议您阅读链接的三篇文章,因为它们详细介绍了 tf.function 的这一点和其他特点。

@nessuno 的回答非常好,对我帮助很大。而实际上文档 tf.autograph.to_graph 直接解释了 autograpsh 和 tf.funciton 之间的关系:

Unlike tf.function, to_graph is a low-level transpiler that converts Python code to TensorFlow graph code. It does not implement any caching, variable management or create any actual ops, and is best used where greater control over the generated TensorFlow graph is desired. Another difference from tf.function is that to_graph will not wrap the graph into a TensorFlow function or a Python callable. Internally, tf.function uses to_graph.