TensorFlow 有两种计算图中部分节点的方法:Session.run
和 Tensor.eval
。这两种方式之间是否有差别?
TensorFlow 有两种计算图中部分节点的方法:Session.run
和 Tensor.eval
。这两种方式之间是否有差别?
t.eval()
等同于调用tf.get_default_session().run(t)
。t = tf.constant(42.0)
sess = tf.Session()
with sess.as_default(): # or `with sess:` to close on exit
assert sess is tf.get_default_session()
assert t.eval() == sess.run(t)
最重要的区别是你可以使用sess.run()
在同一步骤中获取多个张量的值:
t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.mul(t, u)
ut = tf.mul(u, t)
with sess.as_default():
tu.eval() # runs one step
ut.eval() # runs one step
sess.run([tu, ut]) # evaluates both tensors in a single step
eval
和run
都会从头开始执行整个图。要缓存计算结果,请将其分配给tf.Variable
。a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b)
,但是tensorflow报错说形状不匹配,更准确地说,应该至少是2维。 - Charlie Parkertf.multiply(t, u)
,它可以正常工作。 - yuqli关于TensorFlow的常见问题,这里有一个与这个问题完全相同的答案。我会将其放在这里:
如果t
是一个Tensor
对象,那么t.eval()
等同于sess.run(t)
(其中sess
是当前默认的会话)。以下两段代码是等价的:
sess = tf.Session()
c = tf.constant(5.0)
print sess.run(c)
c = tf.constant(5.0)
with tf.Session():
print c.eval()
with
块的生命周期内安装为默认会话。上下文管理器方法可以在简单用例(如单元测试)中导致更简洁的代码;如果您的代码涉及多个图形和会话,则明确调用Session.run()
可能更直接。eval()
无法处理列表对象
tf.reset_default_graph()
a = tf.Variable(0.2, name="a")
b = tf.Variable(0.3, name="b")
z = tf.constant(0.0, name="z0")
for i in range(100):
z = a * tf.cos(z + i) + z * tf.sin(b - i)
grad = tf.gradients(z, [a, b])
init = tf.global_variables_initializer()
with tf.Session() as sess:
init.run()
print("z:", z.eval())
print("grad", grad.eval())
但是Session.run()
可以
print("grad", sess.run(grad))
如果我说错了,请纠正我。
TensorFlow 2.x兼容回答: 将mrry的代码转换为TensorFlow 2.x(>= 2.0)
,以造福社区。
!pip install tensorflow==2.1
import tensorflow as tf
tf.compat.v1.disable_eager_execution()
t = tf.constant(42.0)
sess = tf.compat.v1.Session()
with sess.as_default(): # or `with sess:` to close on exit
assert sess is tf.compat.v1.get_default_session()
assert t.eval() == sess.run(t)
#The most important difference is that you can use sess.run() to fetch the values of many tensors in the same step:
t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.multiply(t, u)
ut = tf.multiply(u, t)
with sess.as_default():
tu.eval() # runs one step
ut.eval() # runs one step
sess.run([tu, ut]) # evaluates both tensors in a single step
tf.Session()
一旦会话初始化,您应该使用该会话,因为所有变量和设置现在都是会话的一部分。因此,有两种方法可以将外部值传递给图形,以便图形接受它们。一种方法是在使用正在执行的会话时调用 .run()。
另一种方式基本上是这个的快捷方式,即使用 .eval()。我说快捷方式,因为 .eval() 的完整形式是
tf.get_default_session().run(values)
values.eval()
的位置上运行 tf.get_default_session().run(values)
。你应该得到相同的结果。
tf.Tensor.eval()
和tf.Session.run()
,但是它们之间有联系,即tf.Operation.run()
和tf.Tensor.eval()
,如此解释在这里。 - prosti