在tensorflow中有三种图,静态计算图,动态计算图,以及Autograph。
静态计算图的执行效率最高。动态计算图方便进行调试,但是运行效率相对会低一些。因为使用动态图会有许多次Python进程和TensorFlow的C++进程之间的通信。而静态计算图构建完成之后几乎全部在TensorFlow内核上使用C++代码执行,效率更高。
如果需要在TensorFlow2.0中使用静态图,可以使用@tf.function装饰器将普通Python函数转换成对应的TensorFlow计算图构建代码。使用tf.function构建静态图的方式叫做 Autograph。
动态计算图
# 动态计算图在每个算子处都进行构建,构建后立即执行x = tf.constant("hello")y = tf.constant("world")z = tf.strings.join([x,y],separator=" ")tf.print(z)
每一步都可以看到相应的输出,但是这种执行效率相对较低。我们可以使用@tf.function将动态图调整为静态图,来提高效率
autograph
1.1 示例
@tf.functiondef strjoin(x, y):z = tf.strings.join([x, y], separator=" ")tf.print(z)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列表或字典等数据结构变量。
