在TensorFlow中,Session.run()和Tensor.eval()有什么区别?
python
tensorflow
5
0

TensorFlow有两种评估图形部分的方法: Session.run变量列表和Tensor.eval 。两者之间有区别吗?

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

关于张量流的FAQ会话对完全相同的问题有一个答案 。我将继续并将其留在此处:


如果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()可能更直接。

我建议您至少在整个FAQ中略读一遍,因为它可能会阐明很多事情。

收藏
评论

如果您有Tensor t,则调用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

请注意,每次调用evalrun都会从头开始执行整个图形。要缓存计算结果,请将其分配给tf.Variable

收藏
评论

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))

如果我错了请纠正我

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题

关于我们

常见问题

内容许可

联系我们

@2020 AskGo
京ICP备20001863号