Question
Let's say I have following code:
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)
Would the if
statement work in the calculation (I do not think so)? If not,
how can I add an if
statement into the TensorFlow calculation graph?
Answer
You're correct that the if
statement doesn't work here, because the
condition is evaluated at graph construction time, whereas presumably you want
the condition to depend on the value fed to the placeholder at runtime. (In
fact, it will always take the first branch, because condition > 0
evaluates
to a Tensor
, which is "truthy" in
Python.)
To support conditional control flow, TensorFlow provides the
tf.cond()
operator, which evaluates one of two branches, depending on a boolean
condition. To show you how to use it, I'll rewrite your program so that
condition
is a scalar tf.int32
value for simplicity:
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)