TensorFlow静态图和eager机制

在eager问世之前(eager在2017.10发布,大概对应版本TensorFlow 1.4,但当前官方建议使用TensorFlow 1.8或以上版本运行eager),TensorFlow一直采用的是静态图机制,其实直到现在TensorFlow的静态图依然大行其道。本文就来介绍一下TensorFlow的静态图机制。

何为静态图/动态图?

静态图是指在图构建完成后,在模型运行时无法进行修改。这里的“图”即为模型的意思,一般一个图就是一个模型。这个图建好之后,运行前需要freeze,然后进行一些优化,例如图融合等,最后启动session根据之前构建的静态图进行计算,计算过程无法对静态图进行更改。

动态图和静态图对应,在模型运行过程中可以对图进行修改。熟悉PyTorch的朋友应该了解,因为PyTorch采用的就是动态图机制。不过一般情况,模型运行过程中也不需要对其进行修改。

另外,TensorFlow静态图带来的一个弊端就是难Debug。因为静态图在freeze后运行前会进行图优化,一些operation会被融合,所以有的operation会消失,无法在计算阶段提供断点和单步调试功能(图构建阶段能单步调试,但是只显示tensor,用处不大)。当然,断点和单步调试功能也会影响程序运行的效率。而PyTorch采用了动态图,自然有Debug方面的优势,提供了单步调试的功能,可以在计算过程查看所有tensor的值,非常直观方便。

所以,目前在学术界,PyTorch的使用很广泛;而在工程界,TensorFlow由于部署有优势,加上operation全面,生态良好而更受欢迎。对于个人而言,往往要看所选择的应用在业界开源代码是基于哪种框架,在别人开源代码的基础上来构建自己的应用,所有两者都需要有一定的快速上手能力。

 

如何判断使用了静态图还是动态图?

如果要使用动态图,也即为eager机制,需要在代码开始加上tf.enable_eager_execution():

import tensorflow as tf

tf.enable_eager_execution()

然后可以用下面的语句来验证eager是否成功打开:

tf.executing_eagerly()

具体的实例:

x = [[2.]]

m = tf.matmul(x, x)

print("hello, {}".format(m))

可以把tf.enable_eager_execution()注释了再运行一下看看区别。

 

OK,希望上面把TensorFlow的静态图和eager机制说清楚了,有不清楚的地方欢迎留言或者联系,我会持续更新。

邮箱:[email protected]

微信公众号:

 

发布了32 篇原创文章 · 获赞 13 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/guanxs/article/details/90523905