2017-06-05 53 views
0

我明白大致如何,當它包含Tensors之一被評估TensorFlow圖表進行評估:的runeval該張量的執行將觸發所有的級聯的計算的圖中的所需要的計算的是張量的值和結果,圖中「導致它」的任何張量也將被計算,並且連接它們的任何操作都將被運行。TensorFlow是否進行優化以避免不必要的圖形重新執行?

因此,如果我有(其中可能還有其他很多的東西)使用int_b操作包含out_a其中的計算涉及到張量的圖形而這又(最終)要求操作an_op本身的執行(最終)使用in,執行

a, b, o = sess.run([out_a, int_b, an_op], feed_dict={in: x}) 

將評估out_aint_ban_op只是一次:中out_aint_b計算都使用相同的EXE an_op;並且用於提供int_b的計算與在計算out_a中使用的計算相同。 (如果我稍後參考a,例如,我使用的是評估張量out_a的值,因此不會再執行結果。)

但是如果我不在此操作中組合我的操作會發生什麼方式:

o = sess.run(an_op, feed_dict={in: x}) 
# ... and later yet, after I remember I need `int_b`: 
b = sess.run(int_b, feed_dict={in: x}) 
# ... later, after I remember I need `out_a`: 
a = sess.run(out_a, feed_dict={in: x}) 

是否有TensorFlow執行在這種情況下,以避免計算an_op一個第二和第三時間任何優化,和int_b第二時間,可能觸發這些計算的副作用?

+0

基於我的觀察,您必須將所有這些變量放在單次運行中才能使用相同的執行(如情況1)。如果你喜歡第二種情況,第二次和第三次運行將再次執行通用操作並給你下一個結果。 – hars

回答

2

是否有TensorFlow執行在這種情況下,以避免 計算an_op一個第二和第三時間,並且int_b第二 時間,可能觸發這些計算的副作用的任何優化?

不,開發人員需要記住需要執行哪些計算並將它們全部放入sess.run函數(您描述的方式)的列表中。

您可以通過運行下面的代碼進行驗證:

import tensorflow as tf 
import numpy as np 
from datetime import datetime 

n = 3000 
t = np.random.rand(n,n) 
a = tf.Variable(t) 
b = tf.matmul(a, a) 

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    startTime = datetime.now() 
    _ = sess.run(b) 
    print datetime.now() - startTime 

    startTime = datetime.now() 
    _ = sess.run(b) 
    print datetime.now() - startTime 

    startTime = datetime.now() 
    _ = sess.run(b) 
    print datetime.now() - startTime 

這在我的機器上的回報:

0:00:02.798704 
0:00:02.940005 
0:00:03.039798 

如果數據將被緩存,第二輪將在任何時間返回。

+0

該測試不應該被期望檢測tensorflow是否在session.run調用之間緩存結果,因爲您使用隨機輸入,而合理的緩存實現將標記爲不可緩存。 – lahwran

+1

@lahwran非常感謝你發現這一點。修復了這個問題。 –