是否有必要同时使用eval并运行?

时间:2016-10-19 09:46:41

标签: python tensorflow

我理解这两者之间的区别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())

我不明白这样做的必要性和实用性。

2 个答案:

答案 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()中受益。