TensorFlow2 AutoGraph
当使用tf.function装饰器注释函数时,可以像调用任何其他函数一样调用它。它将被编译成图,这意味着可以获得更高效地在在GPU或TPU上运行。此时函数变成了一个TensorFlow中的operation。我们可以直接调用函数,输出返回值,但是函数内部是在graph模式下执行的,无法直接查看中间变量数值
代码:
@tf.function
def simple_nn_layer(w,x,b):
print(b)
return tf.nn.relu(tf.matmul(w, x)+b)
w = tf.random.uniform((3, 3))
x = tf.random.uniform((3, 3))
b = tf.constant(0.5, dtype='float32')
simple_nn_layer(w,x,b)
输出:
Tensor("b:0", shape=(), dtype=float32)
通过输出结果可知,无法直接查看函数内部b的数值,而返回值可以通过.numpy()查看。
通过相同的操作(执行一层lstm计算),比较graph和eager execution模式的性能。
代码:
timeit测量小段代码的执行时间
import timeit
创建一个卷积层。
CNN_cell = tf.keras.layers.Conv2D(filters=100,kernel_size=2,strides=(1,1))
利用@tf.function,将操作转化为graph。
@tf.function
def CNN_fn(image):
return CNN_cell(image)
image = tf.zeros([100, 200, 200, 3])
比较两者的执行时间
CNN_cell(image)
CNN_fn(image)
调用timeit.timeit,测量代码执行10次的时间
print("eager execution模式下做一层CNN卷积层运算的时间:", timeit.timeit(lambda: CNN_cell(image), number=10))
print("graph模式下做一层CNN卷积层运算的时间:", timeit.timeit(lambda: CNN_fn(image), number=10))
输出:
eager execution模式下做一层CNN卷积层运算的时间: 18.26327505100926
graph模式下做一层CNN卷积层运算的时间: 6.740775318001397
通过比较,我们可以发现graph模式下代码执行效率要高出许多。因此我们以后,可以多尝试用@tf.function功能,提高代码运行效率。