TensorFlow2 Eager Execution模式
Eager Execution介绍:
TensorFlow的Eager Execution模式是一种命令式编程(imperative programming),这和原生Python是一致的,当你执行某个操作时,可以立即返回结果的。
Graph模式介绍:
TensorFlow1.0一直是采用Graph模式,即先构建一个计算图,然后需要开启Session,喂进实际的数据才真正执行得到结果。
Eager Execution模式下,我们可以更容易debug代码,但是代码的执行效率更低。
下面我们在Eager Execution和Graph模式下,用TensorFlow实现简单的乘法,来对比两个模式的区别。
代码:
x = tf.ones((2, 2), dtype=tf.dtypes.float32)
y = tf.constant([[1, 2],
[3, 4]], dtype=tf.dtypes.float32)
z = tf.matmul(x, y)
print(z)
输出:
tf.Tensor(
[[4. 6.]
[4. 6.]], shape=(2, 2), dtype=float32)
代码:
在TensorFlow 2版本中使用1.X版本的语法;可以使用2.0中的v1兼容包来沿用1.x代码,并在代码中关闭eager运算。
import TensorFlow.compat.v1 as tf
tf.disable_eager_execution()
创建graph,定义计算图
a = tf.ones((2, 2), dtype=tf.dtypes.float32)
b = tf.constant([[1, 2],
[3, 4]], dtype=tf.dtypes.float32)
c = tf.matmul(a, b)
开启绘画,进行运算后,才能取出数据。
with tf.Session() as sess:
print(sess.run(c))
输出:
[[4. 6.]
[4. 6.]]
首先重启一下kernel,使得TensorFlow恢复到2.0版本并打开eager execution模式。 Eager Execution模式的另一个优点是可以使用Python原生功能,比如下面的条件判断:
代码:
import TensorFlow as tf
thre_1 = tf.random.uniform([], 0, 1)
x = tf.reshape(tf.range(0, 4), [2, 2])
print(thre_1)
if thre_1.numpy() > 0.5:
y = tf.matmul(x, x)
else:
y = tf.add(x, x)
输出:
tf.Tensor(0.11304152, shape=(), dtype=float32)
这种动态控制流主要得益于eager执行得到Tensor可以取出numpy值,这避免了使用Graph模式下的tf.cond和tf.while等算子。