मैं यह समझने की कोशिश कर रहा हूं कि उपरोक्त परिदृश्यों में एक with ब्लॉक कैसे व्यवहार करता है। मुझे लगता है कि हमेशा एक ग्राफ और केवल एक सत्र होता है। मैं समझता हूं कि मेरे पास with ब्लॉक में सत्र का उपयोग करके काम करने के (कम से कम?) 2 तरीके हैं:

उदाहरण 1 : as_default() जो एक संदर्भ प्रबंधक बनाता है:
वही दस्तावेज़ कहता है:

with कीवर्ड के साथ प्रयोग करें ताकि यह निर्दिष्ट किया जा सके कि इसमें tf.Operation.run या tf.Tensor.eval को क्रियान्वित किया जाना चाहिए सत्र।

# Create session
sess = tf.Session()
# Enter with block on a new context manager
with sess.as_default():
  # Train: Following line should result calling tf.Operation.run
  sess.run([optimizer, loss], feed_dict={x: x_train, y: y_train)
  # Eval: Following line should result calling tf.Tensor.eval
  sess.run([loss], feed_dict={x: x_eval, y: y_eval)

उदाहरण 2 : जैसा कि समान में बताया गया है, सत्र पर अवरोध के साथ निचले भाग में दस्तावेज़ीकरण:

वैकल्पिक रूप से, आप एक सत्र बनाने के लिए with tf.Session(): का उपयोग कर सकते हैं जो संदर्भ से बाहर निकलने पर स्वचालित रूप से बंद हो जाता है, जिसमें a . भी शामिल है न आया हुआ अपवाद उठाया जाता है।

# Enter with block on session instead of Context Manager
with tf.Session() as sess:
  # Train: Following line seems calling tf.Operation.run as per my test
  sess.run([optimizer, loss], feed_dict={x: x_train, y: y_train)
  # Eval: Following is unclear
  sess.run([loss], feed_dict={x: x_eval, y: y_eval)

मैं समझना चाहता हूं कि सही उपयोग क्या है क्योंकि मैं दोनों मामलों के गिटहब उदाहरण देखता हूं लेकिन निश्चित रूप से परिणामों के बिना। मेरे परीक्षणों में उदाहरण 1 और 2 दोनों प्रशिक्षण के लिए काम करते हैं। मूल्यांकन के लिए ऐसा लगता है कि एक अंतर है जिसे मैं समझ नहीं पा रहा हूं। Tensorflow स्रोत को ब्राउज़ करना मेरे ज्ञान से अधिक है। क्या कोई कृपया समझा सकता है?

3
Manngo 9 अक्टूबर 2018, 23:49

1 उत्तर

सबसे बढ़िया उत्तर

वे थोड़ा अलग काम करते हैं, इसलिए प्रत्येक उपयोग के आधार पर सही हो भी सकता है और नहीं भी। tf.Session.as_default() सिर्फ यह सुनिश्चित करेगा कि सत्र इस प्रकार सेट है डिफ़ॉल्ट वाले, इसलिए eval और run पर कॉल डिफ़ॉल्ट रूप से उस सत्र का उपयोग करेंगे:

import tensorflow as tf

sess = tf.Session()
with sess.as_default():
    print(sess is tf.get_default_session())  # True

हालांकि, जैसा कि दस्तावेज़ीकरण में बताया गया है, tf.Session.as_default() होगा with ब्लॉक के बाद सत्र को स्वचालित रूप से नहीं बंद करें। यदि आप ऐसा चाहते हैं, तो आप सत्र को ही संदर्भ प्रबंधक के रूप में उपयोग कर सकते हैं:

import tensorflow as tf

with tf.Session() as sess:
    # Do something with the session
sess.run([])  # RuntimeError: Attempted to use a closed Session.

हालांकि, हालांकि (मेरे दृष्टिकोण से) स्पष्ट रूप से प्रलेखित नहीं है, एक सत्र को संदर्भ प्रबंधक के रूप में भी के रूप में उपयोग करने से यह डिफ़ॉल्ट सत्र बन जाता है।

import tensorflow as tf

with tf.Session() as sess:
    print(sess is tf.get_default_session())  # True

तब tf.Session.as_default() का क्या मतलब है? ठीक है, बस जब आप अस्थायी रूप से एक सत्र को डिफ़ॉल्ट बनाना चाहते हैं, लेकिन आप उसके बाद इसे बंद करने के लिए नहीं हैं (जिस स्थिति में आपको इसे बाद में मैन्युअल रूप से बंद करना चाहिए, या इसे बाहरी संदर्भ प्रबंधक के रूप में उपयोग करना चाहिए)। यह शायद सबसे अधिक प्रासंगिक है जब आपके पास एक से अधिक खुले सत्र हों। निम्नलिखित मामले पर विचार करें:

import tensorflow as tf

with tf.Session() as sess1, tf.Session() as sess2:
    print(sess2 is tf.get_default_session())  # True

यहां sess2 डिफ़ॉल्ट है क्योंकि इसका संदर्भ बाद में जोड़ा गया था (इसे sess1 द्वारा बनाए गए संदर्भ में "आंतरिक" माना जा सकता है)। लेकिन अब शायद आप कुछ समय के लिए sess1 को डिफ़ॉल्ट बनाना चाहते हैं। हालाँकि आप sess1 को फिर से संदर्भ प्रबंधक के रूप में उपयोग नहीं कर सकते:

import tensorflow as tf

with tf.Session() as sess1, tf.Session() as sess2:
    # Do something with sess2
    with sess1:
        # RuntimeError: Session context managers are not re-entrant.
        #               Use `Session.as_default()` if you want to enter
        #               a session multiple times.

इसलिए आप tf.Session.as_default():

import tensorflow as tf

with tf.Session() as sess1, tf.Session() as sess2:
    with sess1.as_default():
        # Do something with sess1
    with sess2.as_default():
        # Do something with sess2
        # This is not really needed because sess2 was the default
        # in the outer context but you can add it to be explicit
# Both sessions are closed at the end of the outer context

बेशक, आप एक सत्र के साथ भी अतिरिक्त स्पष्ट हो सकते हैं, यदि आप चाहें:

import tensorflow as tf

with tf.Session() as sess, sess.as_default():
    # ...

व्यक्तिगत रूप से, मैंने अपने वास्तविक में कभी भी tf.Session.as_default() का उपयोग नहीं किया है कोड, लेकिन फिर मुझे शायद ही कभी कई सत्रों का उपयोग करने की आवश्यकता होती है, और मैं tf.Session.run() वैसे भी डिफ़ॉल्ट सत्र पर निर्भर रहने के बजाय, लेकिन यह ज्यादातर व्यक्तिगत स्वाद का मामला है जो मुझे लगता है।

3
jdehesa 10 अक्टूबर 2018, 10:46