2017-07-25 13 views
1

次のグラフがあるとします。
- X3およびZは私が気にかけている値です。
- XおよびYは入力です。それぞれ異なる。反復、来値と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を2回計算します。

私の考えは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

1つのオプションは次のとおりです。

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グラフ内のすべてのものを保存する必要はありません。
を見る(など、Saverを使用してのような)他のオプション

ためtensorflow docは注意placeholderに餌をドキュメントで推奨されていますが、中間Tensorに供給することは、最も簡単なあなたの条件を達成しています。

+1

これが正常に動作します。中間ノードX1およびX3に直接値を提供することにより、プレースホルダXがオプションになります。しかし、CPUに転送するのではなく、GPUにデータを保存しておく方がよいでしょう。とにかく、このメソッドは正常に動作します、ありがとう。 – Microos

関連する問題