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


204

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


完整的命名空间tf.Tensor.eval()tf.Session.run(),但连接的tf.Operation.run(),并tf.Tensor.eval()在解释这里
prosti

Answers:


243

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


第二个示例有何不同?仅仅是您可以评估单独的操作(或图形?不确定是什么区别)?
Pinocchio

1
等等,您的示例是否真正运行?我试过了:a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) 我只是从tensorflow那里抱怨到形状不匹配,我想更准确地说,等级必须至少为2。–
Pinocchio

@Pinocchio我认为API随4年前发布的原始答案发生了变化。我用过tf.multiply(t, u),效果很好。
yuqli

42

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


如果tTensor对象,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中略读一遍,因为它可能会阐明很多事情。


2

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

如果我错了请纠正我


1

要记住的最重要的事情:

从TenorFlow获取常量,变量(任何结果)的唯一方法是会话。

知道这一切很容易

两者tf.Session.run()tf.Tensor.eval()从会话中获取结果,这tf.Tensor.eval()是调用的快捷方式tf.get_default_session().run(t)


我还将tf.Operation.run()这里概述该方法:

在会话中启动图形后,可以通过将操作传递到来执行操作tf.Session.run()op.run()是呼叫的捷径tf.get_default_session().run(op)


0

在tensorflow中,您可以创建图并将值传递给该图。Graph会做所有的工作,并根据您在图中进行的配置来生成输出。现在,当您将值传递给图形时,首先需要创建一个tensorflow会话。

tf.Session()

会话初始化后,您应该使用该会话,因为所有变量和设置现在都属于该会话。因此,有两种方法可以将外部值传递给图,以便图接受它们。一种是在使用正在执行的会话时调用.run()。

基本上是该方法的捷径的其他方法是使用.eval()。我说捷径是因为.eval()的完整形式是

tf.get_default_session().run(values)

您可以自己检查。在values.eval()奔跑的地方tf.get_default_session().run(values)。您必须得到相同的行为。

eval的操作是使用默认会话,然后执行run()。


0

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
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.