42

मैं अजगर में एक tensorflow चर के लिए एक नया मान असाइन करने की कोशिश कर रहा हूँ।किसी TensorFlow चर को मान कैसे असाइन करें?

import tensorflow as tf 
import numpy as np 

x = tf.Variable(0) 
init = tf.initialize_all_variables() 
sess = tf.InteractiveSession() 
sess.run(init) 

print(x.eval()) 

x.assign(1) 
print(x.eval()) 

लेकिन उत्पादन मैं

0 
0 

तो मूल्य नहीं बदल गया है। मैं क्या खो रहा हूँ?

उत्तर

72

बयान x.assign(1) वास्तव में मूल्य 1 को x आवंटित नहीं है, बल्कि एक tf.Operation बनाता है कि आप स्पष्ट रूप रन चर को अद्यतन करने के लिए है कि * Operation.run() या Session.run() को एक कॉल संचालन को चलाने के लिए इस्तेमाल किया जा सकता।:

assign_op = x.assign(1) 
sess.run(assign_op) # or `assign_op.op.run()` 
print(x.eval()) 
# ==> 1 

(* वास्तव में, यह एक tf.Tensor देता है, चर का अद्यतन मान के संगत, यह आसान श्रृंखला कार्य करने के लिए बनाने के लिए।)

+0

धन्यवाद! असाइन_ऑप.रुन() एक त्रुटि देता है: विशेषता त्रुटि: 'टेंसर' ऑब्जेक्ट में कोई विशेषता 'रन' नहीं है। लेकिन sess.run (assign_op) पूरी तरह से ठीक चलाता है। – abora

+0

इस उदाहरण में, डेटा ''वैरिएबल'' x' 'असाइन' ऑपरेशन/म्यूटेबल टेंसर को ओवरराइट करने से पहले स्मृति में संग्रहीत किया गया था या एक नया टेंसर बनाया गया है जो अद्यतन मूल्य संग्रहीत करता है? – dannygoldstein

+3

'असाइन()' का मौजूदा कार्यान्वयन मौजूदा मान को ओवरराइट करता है। – mrry

-4

वहाँ एक आसान तरीका है:

सभी की
x = tf.Variable(0) 
x = x + 1 
print x.eval() 
+2

ओपी। 'tf.assign' के उपयोग की जांच कर रहा था, इसके अतिरिक्त नहीं। – vega

6

पहले तुम सिर्फ उन्हें में मूल्यों खिला उसी तरह आप प्लेसहोल्डर के साथ यह करने के द्वारा चर/स्थिरांक को मान निर्दिष्ट कर सकते हैं। तो यह पूरी तरह से करने के लिए कानूनी है:

import tensorflow as tf 
x = tf.Variable(0) 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print sess.run(x, feed_dict={x: 3}) 

tf.assign() ऑपरेटर के साथ अपने भ्रम की स्थिति के बारे में। टीएफ में इसे सत्र के अंदर चलाने से पहले कुछ भी निष्पादित नहीं किया जाता है। तो आपको हमेशा ऐसा कुछ करना होगा: op_name = tf.some_function_that_create_op(params) और उसके बाद सत्र के अंदर आप sess.run(op_name) चलाते हैं। एक उदाहरण के रूप आवंटित का उपयोग कर आप कुछ इस तरह करना होगा:

import tensorflow as tf 
x = tf.Variable(0) 
y = tf.assign(x, 1) 
with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 
    print sess.run(x) 
    print sess.run(y) 
    print sess.run(x) 
+1

ध्यान दें कि 'feed_dict' के माध्यम से मान को खिलाने से वह मान वैरिएबल को असाइन नहीं करता है। –

2

इसके अलावा, यह ध्यान दिया जाना चाहिए कि अगर आप your_tensor.assign() उपयोग कर रहे हैं, तो tf.global_variables_initializer स्पष्ट रूप से के बाद से असाइन आपरेशन आप के लिए यह करता है कहा जाता है की जरूरत नहीं है नहीं है पृष्ठभूमि में।

उदाहरण:

In [212]: w = tf.Variable(12) 
In [213]: w_new = w.assign(34) 

In [214]: with tf.Session() as sess: 
    ...:  sess.run(w_new) 
    ...:  print(w_new.eval()) 

# output 
34 

बहरहाल, यह सभी चर प्रारंभ नहीं होगा, लेकिन यह केवल चर जिस पर assign पर मार डाला गया था प्रारंभ हो जाएगा।

2

आप ग्राफ़ में ऑपरेशन जोड़ने के बिना tf.Variable पर एक नया मान भी निर्दिष्ट कर सकते हैं: tf.Variable.load(value, session)। ग्राफ के बाहर से मूल्य निर्दिष्ट करते समय यह फ़ंक्शन प्लेसहोल्डर्स को भी सहेज सकता है और ग्राफ़ को अंतिम रूप देने में उपयोगी होता है।

import tensorflow as tf 
x = tf.Variable(0) 
sess = tf.Session() 
sess.run(tf.global_variables_initializer()) 
print(sess.run(x)) # Prints 0. 
x.load(1, sess) 
print(sess.run(x)) # Prints 1. 
संबंधित मुद्दे