2016-03-06 20 views
26

Hãy nói rằng tôi đã mã sau:Làm cách nào để thêm điều kiện vào biểu đồ 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) 

có công việc if tuyên bố trong tính toán (Tôi không nghĩ như vậy)? Nếu không, làm cách nào tôi có thể thêm câu lệnh if vào biểu đồ tính toán TensorFlow?

Trả lời

51

Bạn đúng là câu lệnh if không hoạt động ở đây, vì điều kiện được đánh giá vào thời gian xây dựng biểu đồ, trong khi có lẽ bạn muốn điều kiện phụ thuộc vào giá trị được cung cấp cho trình giữ chỗ trong thời gian chạy. (Trong thực tế, nó sẽ luôn luôn lấy chi nhánh đầu tiên, bởi vì condition > 0 để đánh giá một Tensor, đó là "truthy" in Python.)

Để hỗ trợ kiểm soát dòng chảy có điều kiện, TensorFlow cung cấp tf.cond() điều hành, trong đó đánh giá một trong hai chi nhánh, tùy thuộc vào một điều kiện boolean. Để cho bạn thấy làm thế nào để sử dụng nó, tôi sẽ viết lại chương trình của bạn để condition là một tf.int32 giá trị vô hướng vì đơn giản:

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

Cảm ơn bạn rất nhiều vì đã giải thích một cách chi tiết! –

+1

@mrry Cả hai nhánh có được thực thi theo mặc định không? Tôi có tf.cond (c, lambda x: train_op1, lambda x: train_op2) và cả hai train_ops được thực hiện tại mỗi lần thực hiện cond độc lập với giá trị của c. Tôi có làm điều gì sai? –

+5

@PiotrDabkowski Đây là một hành vi đôi khi đáng ngạc nhiên của 'tf.cond()', được xúc động khi [trong tài liệu] (https://www.tensorflow.org/api_docs/python/tf/cond). Tóm lại, bạn cần phải tạo các ops mà bạn muốn chạy có điều kiện * bên trong * các lambdas tương ứng. Mọi thứ bạn tạo ra bên ngoài lambdas nhưng tham chiếu đến cả hai nhánh sẽ thực hiện trong cả hai trường hợp. – mrry

Các vấn đề liên quan