2015-11-18 13 views
35

मैं टेन्सफोर्लो में कुछ साधारण मॉडल के साथ प्रयोग कर रहा हूं, जिसमें पहले MNIST for ML Beginners example के समान दिखता है, लेकिन कुछ हद तक बड़ी आयामता के साथ। मैं ग्रेडियेंट वंश अनुकूलक का उपयोग करने में सक्षम नहीं हूं, बिना किसी समस्या के, पर्याप्त अभिसरण प्राप्त कर रहा हूं। जब मैं एडम अनुकूलक का उपयोग करने का प्रयास करें, मैं इस तरह त्रुटियों मिलती है:टेन्सफोर्लो: एडम ऑप्टिमाइज़र का उपयोग

tensorflow.python.framework.errors.FailedPreconditionError: Attempting to use uninitialized value Variable_21/Adam 
    [[Node: Adam_2/update_Variable_21/ApplyAdam = ApplyAdam[T=DT_FLOAT, use_locking=false, _device="/job:localhost/replica:0/task:0/cpu:0"](Variable_21, Variable_21/Adam, Variable_21/Adam_1, beta1_power_2, beta2_power_2, Adam_2/learning_rate, Adam_2/beta1, Adam_2/beta2, Adam_2/epsilon, gradients_11/add_10_grad/tuple/control_dependency_1)]] 

जहां विशिष्ट चर कि रन के आधार पर अप्रारंभीकृत परिवर्तन किया जा रहा है के बारे में शिकायत। इस त्रुटि का मतलब क्या है? और यह क्या सुझाव गलत है? ऐसा लगता है कि मैं सीखने की दर के बावजूद ऐसा लगता हूं।

उत्तर

65

एडमऑप्टिमाइज़र क्लास "एम" और "वी" accumulators के लिए मूल्य रखने के लिए "स्लॉट" नामक अतिरिक्त चर बनाता है।

यदि आप उत्सुक हैं तो यहां स्रोत देखें, यह वास्तव में काफी पठनीय है: https://github.com/tensorflow/tensorflow/blob/master/tensorflow/python/training/adam.py#L39। अन्य अनुकूलक, जैसे मोमेंटम और एडग्राड स्लॉट का भी उपयोग करते हैं।

मॉडल को प्रशिक्षित करने से पहले इन चरों को प्रारंभ किया जाना चाहिए।

चर प्रारंभ करने में सामान्य तरीके से tf.initialize_all_variables() जो चर ग्राफ जब यह कहा जाता है में मौजूद प्रारंभ करने में ऑप्स कहते हैं कॉल करने के लिए है।

(एक तरफ: विपरीत इसके नाम, initialize_all_variables() कुछ भी प्रारंभ नहीं है, यह केवल ऑप्स कि चर प्रारंभ हो जाएगा जब रन जोड़ सकते हैं।)

तुम क्या करना चाहिए कॉल initialize_all_variables() है के बाद आप ऑप्टिमाइज़र जोड़ा गया है:

...build your model... 
# Add the optimizer 
train_op = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 
# Add the ops to initialize variables. These will include 
# the optimizer slots added by AdamOptimizer(). 
init_op = tf.initialize_all_variables() 

# launch the graph in a session 
sess = tf.Session() 
# Actually intialize the variables 
sess.run(init_op) 
# now train your model 
for ...: 
    sess.run(train_op) 
+1

मान लिया जाये कि मैं पहले से ही प्रशिक्षित चर trashing बिना मैं इसे कैसे प्रारंभ करते बीच में अनुकूलक (और अन्य चर) बदलना चाहते हैं में उपलब्ध है? – dolbi

+0

@ डॉल्बी कोई सुरुचिपूर्ण तरीका नहीं है, लेकिन मैं जिस विधि को रेखांकित करता हूं [यहां] [http://stackoverflow.com/a/35618160/786020)। आप 'tf.itial_variables()' में केवल नए लोगों के साथ 'tf.initialize_variables ([सूची, के, चर,]' का उपयोग कर सकते हैं, क्योंकि ग्राफ में 'AdamOptimizer'' जोड़ते हैं। मुझे कहना है, इस विधि को कोड में इस्तेमाल नहीं किया जाना चाहिए जिसका मतलब एक से अधिक बार चलाना है, लेकिन प्रयोग करते समय यह बहुत अच्छा काम करता है। – Poik

+0

यह उत्तर सही था, लेकिन अब विधि को 'tf.global_variables_initializer() ' – LYu

-3

मुझे एक जैसी समस्या थी। (GradientDescent ऑप्टिमाइज़र के साथ कोई समस्या नहीं है, लेकिन एडम ऑप्टिमाइज़र या किसी अन्य ऑप्टिमाइज़र को अपने चर के साथ उपयोग करते समय उठाई गई त्रुटि)

एक इंटरैक्टिव सत्र में बदलना मेरे लिए इस समस्या को हल करता है।

sess = tf.Session() 

में
sess = tf.InteractiveSession() 
1

FailedPreconditionError: Attempting to use uninitialized value tensorflow से संबंधित सबसे अक्सर त्रुटियों में से एक है। , आधिकारिक दस्तावेज से FailedPreconditionError

यह अपवाद सबसे अधिक उठाया जब एक ऑपरेशन चल रहा है कि पढ़ता एक tf.Variable से पहले ही शुरू कर दिया गया है।

आपके मामले में त्रुटि यह भी बताती है कि किस चर को प्रारंभ नहीं किया गया था: Attempting to use uninitialized value Variable_1। TF ट्यूटोरियल में से एक, चर बारे में बहुत कुछ बताते हैं उनके creation/initialization/saving/loading

मूल रूप से चर प्रारंभ करने में आप 3 विकल्प हैं:

  • tf.global_variables_initializer()
  • के साथ सभी वैश्विक चर प्रारंभ चर आप tf.variables_initializer(list_of_vars) साथ के बारे में परवाह आरंभ कर देगा।ध्यान दें कि आप global_variable_initializer नकल करने के लिए इस सुविधा का उपयोग कर सकते हैं: tf.variable_initializers(tf.global_variables())
  • var_name.initializer

साथ केवल एक चर को प्रारंभ मैं लगभग हमेशा पहले दृष्टिकोण का उपयोग करें। याद रखें कि आपको इसे सत्र चलाने के अंदर रखना चाहिए। तो अगर आप कुछ इस तरह मिल जाएगा: अपने चर के बारे में अधिक जानकारी के बारे में उत्सुक हैं, तो

with tf.Session() as sess: 
    sess.run(tf.global_variables_initializer()) 

, this documentation पढ़ कैसे report_uninitialized_variables जानते हैं और is_variable_initialized जाँच करने के लिए। AdamOptimizer के बाद

0

रन init, और बिना पहले init परिभाषित या init चला

sess.run (tf.initialize_all_variables())

या

sess.run (tf.global_variables_initializer())

0

आप सत्र पर tf.global_variables_initializer() कॉल करने के लिए,

init = tf.global_variables_initializer() 
sess.run(init) 
तरह की जरूरत है

पूर्ण उदाहरण इस महान ट्यूटोरियल https://www.tensorflow.org/get_started/mnist/mechanics

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