TensorFlow中sess.run(c)与c.eval()的区别是什么?
嘿,这个问题问得很精准!在你给出的这个简单场景里,sess.run(c)和c.eval()确实会输出相同的结果(都是5.0),但它们并非完全等价,有几个关键差异值得注意:
一次性计算多个张量的能力
sess.run()支持一次性传入多个张量或操作,一次获取所有结果,比如:# 一次拿到c、a、b三个值,效率更高 c_val, a_val, b_val = sess.run([c, a, b])而
eval()只能针对单个张量,如果要获取多个值,你得多次调用a.eval()、b.eval()、c.eval(),这会触发多次图执行,效率更低。会话上下文的依赖不同
Tensor.eval()必须在活跃的默认会话上下文中才能使用——要么是在with tf.Session() as sess:的代码块里,要么已经通过sess.as_default()将该会话设为默认会话。
而sess.run()更灵活,只要你持有会话对象的引用,哪怕不在默认上下文里也能直接调用(比如你在外部保存了sess变量)。feed_dict的写法差异
两者都支持通过feed_dict临时替换张量的值,但写法略有不同:# sess.run的写法 sess.run(c, feed_dict={a: 10.0, b: 20.0}) # eval的写法 c.eval(feed_dict={a: 10.0, b: 20.0})逻辑效果一致,但调用方式上前者是会话的方法,后者是张量的方法。
适用对象范围不同
sess.run()可以直接执行没有返回值的操作(Operation),比如初始化变量的操作:sess.run(tf.global_variables_initializer())但
eval()只能用于有输出的张量(Tensor),如果你尝试对一个Operation调用eval(),会直接抛出错误。
回到你的代码示例,因为只是单个张量的计算,且都在with tf.Session()的上下文里,所以两者表现完全一致,但在更复杂的场景中,这些差异就会凸显出来啦。
内容的提问来源于stack exchange,提问作者chanwcom

