2016-03-06 5 views
26

की मैं मान लीजिए कोड निम्नलिखित है:किसी टेंसरफ्लो ग्राफ में स्थिति को कैसे जोड़ना है?

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 कथन कैसे जोड़ सकता हूं?

उत्तर

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) है और दोनों train_ops को सी के मान से स्वतंत्र रूप से कंड के प्रत्येक निष्पादन पर निष्पादित किया जाता है। क्या मुझसे कुछ गलत हो रही है? –

+5

@PiotrDabkowski यह 'tf.cond()' का कभी-कभी आश्चर्यजनक व्यवहार है, जो [दस्तावेज़ों में] [https://www.tensorflow.org/api_docs/python/tf/cond) पर स्पर्श किया जाता है। संक्षेप में, आपको उन ऑप्स बनाने की ज़रूरत है जिन्हें आप सशर्त रूप से * संबंधित * भेड़ के अंदर चलाने के लिए चाहते हैं। सबकुछ जो आप भेड़ के बच्चे के बाहर बनाते हैं लेकिन किसी भी शाखा में संदर्भित करते हैं, दोनों मामलों में निष्पादित होगा। – mrry

संबंधित मुद्दे