2015-11-14 7 views
77

tf.app.run() कैसे Tensorflow में काम डेमो का अनुवाद करता है?tf.app.run() कैसे काम करता है?

tensorflow/models/rnn/translate/translate.py में, tf.app.run() पर एक कॉल है। इसे कैसे संभाला जा रहा है?

if __name__ == "__main__": 
    tf.app.run() 

उत्तर

56

यह एक बहुत तेज़ रैपर है जो ध्वज पार्सिंग को संभालता है और फिर अपने मुख्य भाग में भेजता है। code देखें।

+7

इसका मतलब क्या है "ध्वज पार्सिंग हैंडल करता है"? हो सकता है कि आप शुरुआती लोगों को सूचित करने के लिए एक लिंक जोड़ सकें जिसका मतलब क्या है? – Pinocchio

+4

यह झंडे पैकेज का उपयोग कर कार्यक्रम में आपूर्ति की गई कमांड लाइन तर्कों को पार करता है। (जो कवर के तहत मानक 'argparse' लाइब्रेरी का उपयोग करता है, कुछ रैपर के साथ)। यह मेरे उत्तर में जुड़े कोड से जुड़ा हुआ है। – dga

+1

app.py में, 'मुख्य = मुख्य या sys.modules ['__ मुख्य __'] क्या है। मुख्य' और ' sys.exit (मुख्य (sys.argv [: 1] + flags_passthrough)) 'मतलब है? – hAcKnRoCk

56
if __name__ == "__main__": 

का मतलब है वर्तमान फ़ाइल के बजाय एक खोल के तहत निष्पादित एक मॉड्यूल के रूप आयात किया जाता है।

tf.app.run() 

आप फ़ाइल app.py

def run(main=None, argv=None): 
    """Runs the program with an optional 'main' function and 'argv' list.""" 
    f = flags.FLAGS 

    # Extract the args from the optional `argv` list. 
    args = argv[1:] if argv else None 

    # Parse the known flags from that list, or from the command 
    # line otherwise. 
    # pylint: disable=protected-access 
    flags_passthrough = f._parse_flags(args=args) 
    # pylint: enable=protected-access 

    main = main or sys.modules['__main__'].main 

    # Call the main function, passing through any arguments 
    # to the final program. 
    sys.exit(main(sys.argv[:1] + flags_passthrough)) 

आइए ब्रेक लाइन के माध्यम से देख सकते हैं लाइन द्वारा:

flags_passthrough = f._parse_flags(args=args) 

यह सुनिश्चित करता है कि तर्क आप कमांड लाइन के माध्यम से पारित मान्य है, उदा। python my_model.py --data_dir='...' --max_iteration=10000 असल में, यह सुविधा पाइथन मानक argparse मॉड्यूल के आधार पर लागू की गई है।

main = main or sys.modules['__main__'].main 

पहले main= के सही पक्ष में वर्तमान समारोह run(main=None, argv=None) का पहला तर्क है। जबकि sys.modules['__main__'] का अर्थ है वर्तमान चल रही फ़ाइल (उदा। my_model.py)।

  1. आप my_model.py में एक main समारोह की जरूरत नहीं है तो फिर तुम कॉल tf.app.run(my_main_running_function)

  2. करने के लिए है आप my_model.py में एक main समारोह है:

    तो दो मामले हैं। (यह ज्यादातर मामला है।)

अंतिम पंक्ति:

sys.exit(main(sys.argv[:1] + flags_passthrough)) 

ठीक से पार्स तर्क के साथ कहा जाता है अपने main(argv) या my_main_running_function(argv) समारोह सुनिश्चित करता है।

+20

शुरुआती Tensorflow उपयोगकर्ताओं के लिए पहेली का एक गुम टुकड़ा: Tensorflow में कुछ अंतर्निहित कमांड लाइन ध्वज है हैंडलिंग तंत्र। आप अपने झंडे को 'tf.flags.DEFINE_integer (' batch_size ', 128,' बैच में संसाधित करने के लिए छवियों की संख्या 'को परिभाषित कर सकते हैं।) और फिर यदि आप' tf.app.run() 'का उपयोग करते हैं तो यह चीजों को सेट करेगा ताकि आप अपने कोड में जहां भी चाहें वहां से tf.flags.FLAGS.batch_size' जैसे परिभाषित झंडे के पारित मूल्यों को विश्व स्तर पर एक्सेस कर सकें। – isarandi

+0

यह मेरी राय में (वर्तमान) तीन का बेहतर उत्तर है। यह बताता है कि "tf.app.run() कैसे काम करता है", जबकि अन्य दो उत्तरों सिर्फ यह कहते हैं कि यह क्या करता है। –

+0

लाइन से लाइन तोड़ने के लिए धन्यवाद - मेरे लिए बहुत अच्छा काम करता है ... – Roi

1

tf.app में कुछ भी खास नहीं है। यह सिर्फ एक generic entry point script है, जो

Runs the program with an optional 'main' function and 'argv' list.

यह तंत्रिका नेटवर्क के साथ कोई संबंध नहीं है और यह सिर्फ मुख्य कार्य कहता है, यह करने के लिए किसी भी तर्क के माध्यम से गुजर।

from tensorflow.python.platform import flags 
f = flags.FLAGS 

और फिर बहस का एक सेट के साथ अपने कस्टम मुख्य समारोह चलाएँ:

2

सरल शब्दों में, tf.app.run() का काम पहले की तरह बाद में उपयोग के लिए वैश्विक झंडे स्थापित करने के लिए है।

उदा। TensorFlow NMT codebase में, प्रशिक्षण के लिए प्रोग्राम निष्पादन के लिए पहले ही प्रवेश बिंदु/निष्कर्ष इस बिंदु पर शुरू होता है (कोड नीचे देखें)

if __name__ == "__main__": 
    nmt_parser = argparse.ArgumentParser() 
    add_arguments(nmt_parser) 
    FLAGS, unparsed = nmt_parser.parse_known_args() 
    tf.app.run(main=main, argv=[sys.argv[0]] + unparsed) 

argparse का उपयोग कर तर्क पार्स करने के बाद, tf.app.run() के साथ समारोह "मुख्य" चलाने के जो की तरह परिभाषित किया गया है:

def main(unused_argv): 
    default_hparams = create_hparams(FLAGS) 
    train_fn = train.train 
    inference_fn = inference.inference 
    run_main(FLAGS, default_hparams, train_fn, inference_fn) 

तो, वैश्विक उपयोग के लिए झंडे सेट करने के बाद tf.app.run() बस चलाता है कि main समारोह है कि आप argv इसके मापदंडों के रूप में के साथ यह करने के लिए गुजरती हैं।

पी.एस .: Salvador Dali's answer कहते हैं, यह सिर्फ एक अच्छा सॉफ्टवेयर इंजीनियरिंग अभ्यास, मुझे लगता है है, हालांकि मैं यकीन नहीं है कि TensorFlow main समारोह के किसी भी अनुकूलित रन की तुलना में सामान्य CPython का उपयोग कर चलाया गया था प्रदर्शन नहीं कर रहा हूँ।

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