tf.app.run()
Tensorflow'da çalışmak demoyu nasıl tercüme ediyor?
'De tensorflow/models/rnn/translate/translate.py
bir çağrı var tf.app.run()
. Nasıl ele alınır?
if __name__ == "__main__":
tf.app.run()
tf.app.run()
Tensorflow'da çalışmak demoyu nasıl tercüme ediyor?
'De tensorflow/models/rnn/translate/translate.py
bir çağrı var tf.app.run()
. Nasıl ele alınır?
if __name__ == "__main__":
tf.app.run()
Yanıtlar:
if __name__ == "__main__":
geçerli dosyanın modül olarak içe aktarılmak yerine bir kabuk altında yürütüldüğü anlamına gelir.
tf.app.run()
Dosyada görebileceğiniz gibi 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))
Satır satır satır keselim:
flags_passthrough = f._parse_flags(args=args)
Bu, komut satırından geçtiğiniz bağımsız değişkenin geçerli olmasını sağlar, örneğin
python my_model.py --data_dir='...' --max_iteration=10000
Aslında, bu özellik python standart argparse
modülüne göre uygulanır .
main = main or sys.modules['__main__'].main
İlk main
içinde sağ taraf =
akım işlevinin ilk argümanı run(main=None, argv=None)
. While sys.modules['__main__']
geçerli çalışan dosya (ör. my_model.py
) Anlamına gelir .
Yani iki durum var:
İçinde bir main
fonksiyonunuz my_model.py
yok.tf.app.run(my_main_running_function)
içinde bir main
fonksiyon var my_model.py
. (Bu çoğunlukla böyledir.)
Son satır:
sys.exit(main(sys.argv[:1] + flags_passthrough))
main(argv)
veya my_main_running_function(argv)
işlevinizin ayrıştırılmış bağımsız değişkenlerle doğru şekilde çağrılmasını sağlar .
Bayrak ayrıştırmayı işleyen ve daha sonra kendi ana sisteminize gönderen çok hızlı bir sarıcı. Bkz kodu .
main = main or sys.modules['__main__'].main
ve sys.exit(main(sys.argv[:1] + flags_passthrough))
ortalama?
main()
?
Özel bir şey yok tf.app
. Bu sadece bir olan jenerik giriş noktası komut , hangi
Programı isteğe bağlı 'ana' işlev ve 'argv' listesiyle çalıştırır.
Sinir ağları ile ilgisi yoktur ve sadece ana işlevi çağırır, herhangi bir argümandan geçer.
Basit bir ifadeyle, iş tf.app.run()
etmektir ilk seti gibi daha sonraki kullanım için genel bayraklar:
from tensorflow.python.platform import flags
f = flags.FLAGS
ve sonra özel ana işlevinizi bir dizi argümanla çalıştırın.
Örneğin, TensorFlow NMT kod tabanında, eğitim / çıkarım için program yürütme için ilk giriş noktası bu noktada başlar (aşağıdaki koda bakın)
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)
Kullanarak argümanları ayrıştırma sonra argparse
birlikte, tf.app.run()
sizin gibi tanımlanır fonksiyon "ana" çalıştırın:
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)
Bu nedenle, bayrakları global kullanım için ayarladıktan sonra, kendisine ilettiğiniz işlevi parametreleri olarak tf.app.run()
çalıştırmanız yeterlidir .main
argv
Not: Salvador Dali'nin cevabının söylediği gibi, sadece iyi bir yazılım mühendisliği uygulaması, sanırım, TensorFlow'un main
normal CPython kullanılarak çalıştırılandan daha iyi bir işlev çalışması gerçekleştirip gerçekleştirmediğinden emin değilim .
Google kodu, kitaplıklara / ikili dosyalara / python komut dosyalarına erişen küresel bayraklara çok bağlıdır ve bu nedenle tf.app.run (), FLAG'lar (veya benzer bir şey) değişkeninde küresel bir durum oluşturmak için bu bayrakları ayrıştırır ve sonra python main ( ) olması gerektiği gibi.
Eğer tf.app.run () çağrısına sahip değillerse, kullanıcılar FLAG'ları ayrıştırmayı unutabilir ve bu da kütüphanelerin / ikili dosyaların / komut dosyalarının ihtiyaç duydukları FLAG'lara erişememesine yol açabilir.
2.0 Uyumlu Cevap : Kullanmak isterseniz tf.app.run()
de Tensorflow 2.0
, biz, komutu kullanmalısınız
tf.compat.v1.app.run()
veya kodu tf_upgrade_v2
dönüştürmek 1.x
için kullanabilirsiniz 2.0
.
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')
ve daha sonra kullanırsanız , tanımladığınız bayraklarıntf.app.run()
geçirilen değerlerine,tf.flags.FLAGS.batch_size
kodunuzda ihtiyacınız olan her yerden küresel olarak erişebilmeniz için bir şeyler kurar .