在tensorflow中有三种图,静态计算图,动态计算图,以及Autograph。

静态计算图的执行效率最高。动态计算图方便进行调试,但是运行效率相对会低一些。因为使用动态图会有许多次Python进程和TensorFlow的C++进程之间的通信。而静态计算图构建完成之后几乎全部在TensorFlow内核上使用C++代码执行,效率更高。

如果需要在TensorFlow2.0中使用静态图,可以使用@tf.function装饰器将普通Python函数转换成对应的TensorFlow计算图构建代码。使用tf.function构建静态图的方式叫做 Autograph。

动态计算图

  1. # 动态计算图在每个算子处都进行构建,构建后立即执行
  2. x = tf.constant("hello")
  3. y = tf.constant("world")
  4. z = tf.strings.join([x,y],separator=" ")
  5. tf.print(z)

每一步都可以看到相应的输出,但是这种执行效率相对较低。我们可以使用@tf.function将动态图调整为静态图,来提高效率

autograph

1.1 示例

  1. @tf.function
  2. def strjoin(x, y):
  3. z = tf.strings.join([x, y], separator=" ")
  4. tf.print(z)
  5. return z

1.2 使用规范

  • 被@tf.function修饰的函数应尽可能使用TensorFlow中的函数而不是Python中的其他函数。例如使用tf.print而不是print,使用tf.range而不是range,使用tf.constant(True)而不是True.
  • 避免在@tf.function修饰的函数内部定义tf.Variable.
  • 被@tf.function修饰的函数不可修改该函数外部的Python列表或字典等数据结构变量。