2015-11-13 23 views
8

条件に基づいてグラフの一部を実行する方法を選択するにはどうすればよいですか?TensorFlowの条件付き実行

プレースホルダの値がfeed_dictにある場合にのみ実行される私のネットワークの一部があります。値が指定されていない場合は、別のパスが使用されます。テンソルフローを使ってこれを実装するにはどうすればいいですか?ここで

は、私のコードの関連部分されています、私はここでif N > 0:

答えて

7

Hrm。それは)(何をしたいがtf.control_flow_ops.condされている可能性があります https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/ops/control_flow_ops.py#L597

しかし、それはTFの名前空間にエクスポートいない、と私は、このインタフェースがどのように保証、安定チェックせずに答えるんだけど、それは解放のモデルに使われています、それのために行く。 :)

ただし、feed_dictの作成時に実際にどのようなパスが必要かを実際に知っているので、別の方法でモデルを呼び出すこともできます。

def model(input, n_greater_than): 
    ... cleverness ... 
    if n_greater_than: 
    ... other cleverness... 
    return tf.reduce_mean(input) 


out1 = model(input, True) 
out2 = model(input, False) 

そして、あなたはあなたの計算を実行し、feed_dictを設定しようとしているときに、OUT1またはあなたが知っていることに応じて、OUT2のノードを引っ張っ:これを行うための標準的な方法は、例えば、次のようなコードを設定することです。デフォルトでは、モデルが同じ変数を参照する場合(のmodel()funcの外に作成すると)、基本的に2つの別々のパスがあります。

あなたは、畳み込みmnist例では、この例を見ることができます:https://github.com/tensorflow/tensorflow/blob/master/tensorflow/models/image/mnist/convolutional.py#L165

私はあなたができる場合は、制御フローの依存性を導入することなく、このようにそれを行うためのファンです。

0

の代わりに使用するために何かのために上記のコードで

sess.run(accuracy, feed_dict={inputs: mnist.test.images, outputs: mnist.test.labels}) 

N = tf.shape(outputs) 
    cost = 0 
    if N > 0: 
     y_N = tf.slice(h_c, [0, 0], N) 
     cross_entropy = tf.nn.softmax_cross_entropy_with_logits(y_N, outputs, name='xentropy') 
     cost = tf.reduce_mean(cross_entropy, name='xentropy_mean') 

探しています簡単な例であり、その缶あなたを始めましょう。テンソルを減算する方法を確認するために

import tensorflow as tf 

a = tf.Variable([[3.0, 3.0], [3.0, 3.0]]) 
b = tf.Variable([[1.0, 1.0], [2.0, 2.0]]) 
l = tf.shape(a) 

add_op, sub_op = tf.add(a, b), tf.sub(a, b) 

sess = tf.Session() 
init = tf.initialize_all_variables() 
sess.run(init) 
t = sess.run(l) 

print sess.run(sub_op if t[0] == 3 else add_op) 

sess.close() 

変更3 2:これは、テンソルの形状に基づいて、グラフの異なる部分を実行します。あなたが見る通り、私はaddsubshapeのためのノードを開始しました、グラフで私は形状をチェックし、特定の部分を実行します。