我理解这两者之间的区别answer。 但在大多数会谈/代码在线,我发现人们使用如下两个:
import tensorflow as tf
a=tf.constant(5.0)
b=tf.constant(6.0)
c=a*b
with tf.Session() as sess:
print(sess.run(c))
print(c.eval())
我不明白这样做的必要性和实用性。
答案 0 :(得分:4)
在同一会话中呼叫sess.run(c)
和c.eval()
,可提供完全相同的结果。
您可以在代码中混合调用sess.run
和<tensor>.eval()
,但这会使您的代码不那么一致。
在我看来,总是使用sess.run
更好,因为在一次通话中你可以评估多个张量。
相反,如果您使用<tensor>.eval()
,则可以评估 指定的<tensor>
。
您可以看到运行此脚本的性能差异:
import time
import tensorflow as tf
a=tf.constant(5.0)
b=tf.constant(6.0)
c=a*b
start = time.time()
with tf.Session() as sess:
sess.run([c]*100)
end_run = time.time() - start
start = time.time()
with tf.Session() as sess:
for _ in range(100):
c.eval()
end_eval = time.time() - start
print('Run: {}\nEval: {}'.format(end_run, end_eval))
在Tensorflow r0.11上运行它,在CPU(Intel i3)上它给出了这个结果:
Run: 0.009401798248291016
Eval: 0.021142005920410156
正如您所看到的,执行带有100个元素列表的sess.run
调用比执行100个c.eval()
调用要快得多。
实际上,Tensorflow只评估c
调用中sess.run
张量的一次,并在需要时重复使用结果进行其他计算。
答案 1 :(得分:0)
您问题的快速回答是否。
您只需要Session.run()
或Tensor.eval()
来评估张量对象的值。人们通常使用Tensor.eval()
来试验编程模型,即打印出张量值来跟踪流程!例如,
import tensorflow as tf
a = tf.constant([1, 2], name='a')
b = tf.constant([3, 4], name='b')
c = tf.constant([1, 3], name='c')
d = tf.add_n([a, b])
e = tf.pow(d, c)
printout_d = tf.Print(d, [a, b, d], 'Input for d and the result: ')
printout_e = tf.Print(e, [d, c, e], 'Input for e and the result: ')
with tf.Session() as sess:
sess.run([d, e])
printout_d.eval()
printout_e.eval()
在上面的代码中,您只需要sess.run([d, e])
来执行图表。但是,在某些情况下,例如调试,您可以从printout_d.eval()
和printout_e.eval()
中受益。