在 TensorFlow 中,Session.run() 和 Tensor.eval() 有什么区别?
In TensorFlow, what is the difference between Session.run() and Tensor.eval()?
TensorFlow 有两种评估图的一部分的方法:Session.run
变量列表和 Tensor.eval
。这两者有区别吗?
如果你有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
请注意,每次调用 eval
和 run
都会从头开始执行整个图。要缓存计算结果,请将其分配给 tf.Variable
.
关于张量流的常见问题解答会话有一个 answer to exactly the same question。我将继续并留在这里:
如果 t
是一个 Tensor
对象,对于 sess.run(t)
,t.eval()
是 shorthand(其中 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 中,您创建图形并将值传递给该图形。 Graph 完成所有艰苦的工作,并根据您在图中所做的配置生成输出。
现在,当您将值传递给图表时,首先您需要创建一个 tensorflow 会话。
tf.Session()
会话初始化后,您应该使用该会话,因为所有变量和设置现在都是会话的一部分。因此,有两种方法可以将外部值传递给图形,以便图形接受它们。一种是在使用正在执行的会话时调用 .运行()。
其他基本上是快捷方式的方法是使用 .eval()。我说快捷方式是因为 .eval() 的完整形式是
tf.get_default_session().run(values)
你可以自己检查一下。
在values.eval()
运行tf.get_default_session().run(values)
的地方。您必须获得相同的行为。
eval 所做的是使用默认会话,然后执行 运行()。
要记住的最重要的事情:
The only way to get a constant, variable (any result) from TenorFlow is the session.
知道这个其他一切都是easy:
Both tf.Session.run()
and tf.Tensor.eval()
get results from the session where tf.Tensor.eval()
is a shortcut for calling tf.get_default_session().run(t)
我还会概述方法 tf.Operation.run()
,如 here:
After the graph has been launched in a session, an Operation can be executed by passing it to tf.Session.run()
. op.run()
is a shortcut for calling tf.get_default_session().run(op)
.
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
TensorFlow 有两种评估图的一部分的方法:Session.run
变量列表和 Tensor.eval
。这两者有区别吗?
如果你有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
请注意,每次调用 eval
和 run
都会从头开始执行整个图。要缓存计算结果,请将其分配给 tf.Variable
.
关于张量流的常见问题解答会话有一个 answer to exactly the same question。我将继续并留在这里:
如果 t
是一个 Tensor
对象,对于 sess.run(t)
,t.eval()
是 shorthand(其中 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 中,您创建图形并将值传递给该图形。 Graph 完成所有艰苦的工作,并根据您在图中所做的配置生成输出。 现在,当您将值传递给图表时,首先您需要创建一个 tensorflow 会话。
tf.Session()
会话初始化后,您应该使用该会话,因为所有变量和设置现在都是会话的一部分。因此,有两种方法可以将外部值传递给图形,以便图形接受它们。一种是在使用正在执行的会话时调用 .运行()。
其他基本上是快捷方式的方法是使用 .eval()。我说快捷方式是因为 .eval() 的完整形式是
tf.get_default_session().run(values)
你可以自己检查一下。
在values.eval()
运行tf.get_default_session().run(values)
的地方。您必须获得相同的行为。
eval 所做的是使用默认会话,然后执行 运行()。
要记住的最重要的事情:
The only way to get a constant, variable (any result) from TenorFlow is the session.
知道这个其他一切都是easy:
Both
tf.Session.run()
andtf.Tensor.eval()
get results from the session wheretf.Tensor.eval()
is a shortcut for callingtf.get_default_session().run(t)
我还会概述方法 tf.Operation.run()
,如 here:
After the graph has been launched in a session, an Operation can be executed by passing it to
tf.Session.run()
.op.run()
is a shortcut for callingtf.get_default_session().run(op)
.
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