2016-02-02 10 views
7

मैं टेंसरफ्लो में एक ऑटोइनक्रिकमेंटिंग ग्राफ बनाने की कोशिश कर रहा था। मैंने सोचा कि assign सेशन इसके लिए उपयुक्त हो सकता है, लेकिन इसके लिए कोई दस्तावेज नहीं मिला।टेंसरफ्लो में ऑप असाइन करें: वापसी मूल्य क्या है?

मैं मान लिया है कि इस सेशन सी जैसी भाषाओं — में की तरह अपने मूल्य — वापस आती है और निम्नलिखित कोड लिखा है:

import tensorflow as tf 

counter = tf.Variable(0, name="counter") 

one = tf.constant(1) 
ten = tf.constant(10) 

new_counter = tf.add(counter, one) 
assign = tf.assign(counter, new_counter) 
result = tf.add(assign, ten) 

init_op = tf.initialize_all_variables() 

with tf.Session() as sess: 

    sess.run(init_op) 

    for _ in range(3): 

    print sess.run(result) 

और इस कोड काम करता है।

सवाल यह है: क्या यह अपेक्षित व्यवहार है? असाइन ओप क्यों दस्तावेज नहीं किया गया है: https://www.tensorflow.org/versions/0.6.0/api_docs/index.html

क्या यह एक अनुशंसित सेशन है?

उत्तर

13

tf.assign() ऑपरेटर अंतर्निहित तंत्र है जो Variable.assign() विधि लागू करता है। यह परिवर्तनीय टेंसर (tf.*_ref प्रकार के साथ) और एक नया मान लेता है, और परिवर्तनीय टेंसर देता है जिसे नए मान के साथ अपडेट किया गया है। बाद में पढ़ने से पहले एक असाइनमेंट ऑर्डर करना आसान बनाने के लिए वापसी मूल्य प्रदान किया जाता है, लेकिन यह सुविधा अच्छी तरह से प्रलेखित नहीं है। एक उदाहरण उम्मीद है कि उदाहरण देकर स्पष्ट करना होगा:

v = tf.Variable(0) 
new_v = v.assign(10) 
output = v + 5 # `v` is evaluated before or after the assignment. 

sess.run(v.initializer) 

result, _ = sess.run([output, new_v.op]) 
print result # ==> 10 or 15, depending on the order of execution. 

v = tf.Variable(0) 
new_v = v.assign(10) 
output = new_v + 5 # `new_v` is evaluated after the assignment. 

sess.run(v.initializer) 

result = sess.run([output]) 
print result # ==> 15 

अपने कोड उदाहरण में dataflow निर्भरता निष्पादन [read counter] -> new_counter = tf.add(...) -> tf.assign(...) -> [read output of assign] -> result = tf.add(...), जिसका अर्थ है कि अर्थ विज्ञान स्पष्ट कर रहे हैं के आदेश को लागू। हालांकि, काउंटर को अपडेट करने के लिए पढ़ने-संशोधित-लिखने के चरण कुछ हद तक अक्षम हैं, और कई चरणों को समवर्ती रूप से चलने पर अप्रत्याशित व्यवहार हो सकता है। उदाहरण के लिए, एक ही वैरिएबल तक पहुंचने वाले कई थ्रेड काउंटर को पीछे की तरफ देख सकते हैं (इस मामले में कि एक पुराने मान को नए मान के बाद वापस लिखा गया हो)।

मैं, सुझाव है कि आप Variable.assign_add() का उपयोग काउंटर अद्यतन करने के लिए इस प्रकार है:

counter = tf.Variable(0, name="counter") 

one = tf.constant(1) 
ten = tf.constant(10) 

# assign_add ensures that the counter always moves forward. 
updated_counter = counter.assign_add(one, use_locking=True) 

result = tf.add(updated_counter, ten) 
# ... 
+3

हम पहले कोड स्निपेट चलाते हैं और हमने केवल यह देखा है कि आउटपुट केवल 5 या 15 हो सकता है। –

4

tf.assign() अच्छी तरह से documented in the latest versions है और यह परियोजनाओं में अक्सर इस्तेमाल किया जाता है।

यह ऑपरेशन असाइनमेंट के बाद "रेफरी" आउटपुट करता है। यह बनाता है जो श्रृंखला संचालन को आसान बनाता है जिसे रीसेट मान का उपयोग करने की आवश्यकता होती है।

आसान शब्दों में यह आपके मूल टेंसर और एक नया टेंसर लेता है। यह आपके नए टेंसर के मूल मूल्य को एक नए मान के साथ अपडेट करता है और आपके मूल टेंसर का संदर्भ देता है।

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