2016-03-10 67 views
5

如果TensorFlow涉及多個對同一個計算(子)圖的調用,它們會自動緩存計算嗎?Can TensorFlow緩存(子)圖計算?

例如,我有一個矩陣F,其中每個條目表示基於可訓練變量W的 計算。我的目標函數 將這個矩陣乘以不同的向量幾次(每個 時間W不變)。

是否會TensorFlow重新計算,例如,F[1,2]每當我訪問 它,還是會緩存該值?

在理論上,人們可以預先計算矩陣給定一個固定的W, 使得F每個條目是tf.constantF。但那 阻止W的梯度的正確計算。

+0

這個問題似乎相關:http://stackoverflow.com/questions/34536340/how-to-use-tensorflow-optimizer-without-recomputing-activations-in-reinforcement –

回答

2

TensorFlow執行有限數量的緩存,但它可能不包括您描述的情況。

如果您創建一個具有以下選項的tf.Session,常量摺疊將被啓用:

config = tf.ConfigProto(graph_options=tf.GraphOptions(
    optimizer_options=tf.OptimizerOptions(opt_level=tf.OptimizerOptions.L2))) 
sess = tf.Session(config=config) 

當你調用sess.run()此配置,TensorFlow將評估適當的節點來運行,然後找出那些子圖輸出不變的節點,評估它們並緩存結果。因此,它將避免重新執行冗餘計算。

但是,在你的問題中,你提到F是一些可訓練變量的函數。從TensorFlow的觀點來看,這些變量是不穩定的—它們可能在任何時候改變—,所以它不會緩存從這些變量派生的值。如果您想多次重複使用F的相同值,則可以考慮將其存儲在tf.constant()中,以便常量摺疊優化更有用。

+0

感謝您的信息。我看到選項'tf.OptimizerOptions.L1'確實有'common_subexpression_elimination','tf.OptimizerOptions.L2'確實'constant_folding'。但如果這些選項不能正確處理梯度,它不適用於我的情況。 –

+0

這兩種優化都不應該影響程序的語義,所以應該正確處理梯度。但是,由於絕大多數梯度計算取決於當前的變量值,因此我不希望有大的加速(由於消除了運算調度開銷,可能只有幾個百分點)。 – mrry