2017-07-25 107 views
1

假設我有以下圖表。
- X3Z是我關心的價值觀。
- XY是輸入。在每個不同的。迭代,未來的價值和XY形狀是不同的,所以我認爲他們多是placeholder
- 的情況是,我需要在不同的時間點運行兩次此圖以獲得X3Z異步。Tensorflow,如何保留中間節點值並重用它們

+---+  op: +1   op: *3 
| X +------------> X_1 +-----------> X3   +---+ 
+---+    +    +    | Y | 
        |    |    +-+-+ 
        |    op:add    | 
        |    |    | 
        |    |    | 
        | op: add  v  op:add | 
        +------------->  <------------+ 
            Z 

在較早的時間點,我得到一個輸入X(比如X=7,我不知道什麼是Y是在這一刻)。我想看看X3的價值。所以我執行sess.run([X3], {X:7}),然後按預期返回24

在稍後的時間點,我得到另一個輸入Y(比如Y=8),這個時候我只想看看節點Z。但重點是我必須執行sess.run([Z], {X:7, Y:8})才能得到結果。

問題是,對於以後的運行,我必須再次輸入X來重新計算中間節點X_1X3。它計算流量X--> X_1 --> X3兩次,這會損害效率。

我的想法是,X_1X3將前期運行後包含的值(X_1=8X3=24),直到圖形被破壞,那麼我就可以直接利用的,而不是重新計算。

有沒有辦法達到目標?

回答

0

下沒有完全解決你的問題,但它逃脫了再喂X

X_temp = tf.Variable(0, dtype=tf.int32) 
X = tf.placeholder_with_default(X_temp, shape=()) 
Y = tf.placeholder(tf.int32, shape=()) 
X_temp = tf.assign(X_temp, X) 

X_1 = X_temp + 1 
X3 = X_1 * 3 
Z = X_1 + X3 + Y 

sess = tf.InteractiveSession() 
print(sess.run(X3, {X:7})) 
print(sess.run(Z, {Y:8})) 

#24 
#40 
0

一種選擇,我會建議是:

temp_X1, temp_X3 = sess.run([X_1, X3], feed_dict={X:7}) 
    sess.run(Z, feed_dict={X_1:temp_X1, X3:temp_X3, Y: 8} 

你並不需要存儲tf圖裏面的一切。
tensorflow doc其他選項(如使用Saver等)

注意:送入placeholder由商務部推薦,但送入中間Tensor達到您的要求最簡單的。

+1

這工作得很好。直接向中間節點X1和X3提供值將使佔位符X成爲可選項。但有一種方法可以讓數據保持在GPU中而不是傳輸到CPU上。無論如何,這種方法工作正常,謝謝。 – Microos

相關問題