2016-03-06 103 views
26

比方說,我有以下代碼:如何在TensorFlow圖中添加條件?

x = tf.placeholder("float32", shape=[None, ins_size**2*3], name = "x_input") 
condition = tf.placeholder("int32", shape=[1, 1], name = "condition") 
W = tf.Variable(tf.zeros([ins_size**2*3,label_option]), name = "weights") 
b = tf.Variable(tf.zeros([label_option]), name = "bias") 

if condition > 0: 
    y = tf.nn.softmax(tf.matmul(x, W) + b) 
else: 
    y = tf.nn.softmax(tf.matmul(x, W) - b) 

將在計算if聲明的工作(我不這麼認爲)?如果不是,我怎樣才能將一個if語句添加到TensorFlow計算圖中?

回答

51

由於條件是在圖構建時評估的,因此您確定if語句在此處不起作用,而假設您希望條件取決於在運行時向該佔位符提供的值。 (事實上​​,它將始終以第一分支,因爲condition > 0計算結果爲Tensor,這是"truthy" in Python。)

爲了支持條件的控制流程,TensorFlow提供tf.cond()操作者,其評估兩個中的一個分支,這取決於一個布爾條件。爲了向你展示如何使用它,我會重寫你的程序,以便condition是簡單的標tf.int32值:

x = tf.placeholder(tf.float32, shape=[None, ins_size**2*3], name="x_input") 
condition = tf.placeholder(tf.int32, shape=[], name="condition") 
W = tf.Variable(tf.zeros([ins_size**2 * 3, label_option]), name="weights") 
b = tf.Variable(tf.zeros([label_option]), name="bias") 

y = tf.cond(condition > 0, lambda: tf.matmul(x, W) + b, lambda: tf.matmul(x, W) - b) 
+1

謝謝你這麼多的解釋,詳細! –

+1

@mrry兩個分支默認都執行了嗎?我有tf.cond(c,lambda x:train_op1,lambda x:train_op2),並且每次執行cond時都會執行兩次train_ops,而與c的值無關。難道我做錯了什麼? –

+5

@PiotrDabkowski這是'tf.cond()'有時令人驚訝的行爲,在[文檔](https://www.tensorflow.org/api_docs/python/tf/cond)中被觸及。簡而言之,您需要創建您想要在各自的lambda表達式中有條件運行的操作。您在lambdas之外創建但在兩個分支中引用的所有內容都將在兩種情況下執行。 – mrry