TensorFlow有兩種方式來評估Graph(計算圖)的一部分:對變量列表做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()
在相同的步驟中獲取多個Tensor(張量)的值:
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
不能處理對象列表數據
注意,每次調用eval
和run
將從頭開始執行整個計算圖。要緩存計算結果,請將結果存入tf.Variable
。
次佳解決思路
TensorFlow的FAQ會話部分有一個answer to exactly the same question。進一步說明如下:
如果t
是Tensor
對象,則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()
。