グラフに条件付き制御フローが必要です。 pred
がTrue
の場合、グラフは変数を更新するopを呼び出す必要があります。それ以外の場合は変数を変更しません。簡略化されたバージョンである:ただし、Iはupdate_x_2
がtf.cond
によって選択されていない場合にアサインOPも呼ばれている意味と同じ結果y=[2]
にその両方pred=True
とpred=False
リードを見つける`tf.cond`の動作によって混乱します
pred = tf.constant(True)
x = tf.Variable([1])
assign_x_2 = tf.assign(x, [2])
def update_x_2():
with tf.control_dependencies([assign_x_2]):
return tf.identity(x)
y = tf.cond(pred, update_x_2, lambda: tf.identity(x))
with tf.Session() as session:
session.run(tf.initialize_all_variables())
print(y.eval())
。これを説明する方法は?そしてこの問題を解決するには?
ええ、それは私を混乱させるものです。 'tf.cond'を実行する前にランタイムはすべての依存関係が実行されるようにします。 'True'ブランチと' False'ブランチでのopsの依存関係は 'cond'の依存関係でもあるので、ブランチのオペレーションは決して実行されないかもしれませんが、その依存関係はすべて実行されます。 –
Yep - グラフのプルーニングは、実行するブランチの可能性のあるすべての依存関係を考慮し、ブランチの1つの内部で定義されていれば実行を禁止します。これは、 'CondContext'がピボットにコントロールの依存関係を追加するためです(https: //github.com/tensorflow/tensorflow/blob/2b2f312cb07765c628d264abe326bfc286f462c1/tensorflow/python/ops/control_flow_ops.py#L1092)、分岐が取られていない場合、その依存関係はデッドテンソル(実行を妨げる)になります。 – mrry
このような理由は何でしたか?非アクティブブランチの背後にあるサブグラフを整理してみてはいかがですか? –