image-20230128195103203

image-20230128195115840

image-20230128195126622

image-20230128195158697

image-20230128195253435

image-20230128195401341

当被 @tf.function 修饰的函数第一次被调用的时候, 进行以下操作:

(1)在 Eager Execution 模式关闭的环境下,函数内的 代码依次运行。也就是说,每个 tf. 方法都只是定义了计 算节点,而并没有进行任何实质的计算。这与 TensorFlow 1.X 的 Graph Execution 是一致的

(2)使用 AutoGraph 将函数中的 Python 控制流语句 转换成 TensorFlow 计算图中的对应节点 (比如说 while 和 for 语句转换为 tf.while , if 语句转 换为 tf.cond 等等;

(3)基于上面的两步,建立函数内代码的计算图表示 (为了保证图的计算顺序,图中还会自动加入一些 tf.control_dependencies 节点)

(4)运行一次这个计算图

(5)基于函数的名字和输入的函数参数的类型生成一个 哈希值,并将建立的计算图缓存到一个哈希表中。

(6)在被 @tf.function 修饰的函数之后再次被调用的 时候,根据函数名和输入的函数参数的类型计算哈希值, 检查哈希表中是否已经有了对应计算图的缓存。如果是, 则直接使用已缓存的计算图,否则重新按上述步骤建立 计算图。

总结

AutoGraph 起到了类似编译器的作用,能够帮助我们通 过更加自然的 Python 控制流轻松地构建带有条件 / 循 环的计算图,而无需手动使用 TensorFlow 的 API 进行 构建。

@tf.function 使用

当定义多个函数实现不同的运算式, 仅需要在最后调用的函数上添加@tf.function装饰器 即可 这样所有的运算节点都会被编译