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

时间:2015-11-09 13:52:53

标签: python tensorflow

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

6 个答案:

答案 0 :(得分:220)

如果您有tf.get_default_session().run(t) t,则调用t.eval()相当于拨打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和{{1}}都会从头开始执行整个图表。要缓存计算结果,请将其分配给tf.Variable

答案 1 :(得分:39)

张量流的FAQ会话有answer to exactly the same question。我会继续把它留在这里:

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

我建议您至少浏览整个常见问题解答,因为它可能会澄清很多内容。

答案 2 :(得分: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))

如果我错了,请纠正我

答案 3 :(得分:0)

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

tf.Session()

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

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

tf.get_default_session().run(values)

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

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

答案 4 :(得分:0)

最重要的事情要记住:

  

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

知道这一切的还有easy

  

tf.Session.run()tf.Tensor.eval()都从会话中获得结果,其中tf.Tensor.eval()是调用tf.get_default_session().run(t)的快捷方式


我还将概述here中的方法tf.Operation.run()

  

在会话中启动图形后,可以通过将其传递到tf.Session.run()来执行操作。 op.run()是调用tf.get_default_session().run(op)的快捷方式。

答案 5 :(得分: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