Tf.app.run () nasıl çalışır?


148

tf.app.run()Tensorflow'da çalışmak demoyu nasıl tercüme ediyor?

'De tensorflow/models/rnn/translate/translate.pybir çağrı var tf.app.run(). Nasıl ele alınır?

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

Yanıtlar:


134
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=10000Aslında, bu özellik python standart argparsemodülüne göre uygulanır .

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

İlk mainiç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:

  1. İçinde bir mainfonksiyonunuz my_model.pyyok.tf.app.run(my_main_running_function)

  2. içinde bir mainfonksiyon 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 .


67
Yeni başlayanlar için bulmacanın eksik bir parçası Tensorflow kullanıcıları: Tensorflow'un yerleşik bir komut satırı bayrak işleme mekanizması var. Bayraklarınızı şöyle tanımlayabilirsiniz 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ın tf.app.run()geçirilen değerlerine, tf.flags.FLAGS.batch_sizekodunuzda ihtiyacınız olan her yerden küresel olarak erişebilmeniz için bir şeyler kurar .
isarandi

1
Bence (şu anki) üçünün daha iyi cevabı bu. Diğer iki cevap sadece ne yaptığını söylerken, "tf.app.run () nasıl çalışır?"
Thomas Fauskanger


75

Bayrak ayrıştırmayı işleyen ve daha sonra kendi ana sisteminize gönderen çok hızlı bir sarıcı. Bkz kodu .


12
"bayrak ayrıştırma kolları" ne anlama gelir? Belki de yeni başlayanlara bunun ne anlama geldiğini bildirmek için bir bağlantı ekleyebilirsiniz.
Pinokyo

4
Flags paketini kullanarak programa sağlanan komut satırı bağımsız değişkenlerini ayrıştırır. (kapakların altında bazı paketlerle standart 'argparse' kitaplığını kullanır). Cevabımda bağlandığım koddan bağlantılı.
dga

1
App.py olarak, ne main = main or sys.modules['__main__'].mainve sys.exit(main(sys.argv[:1] + flags_passthrough))ortalama?
hAcKnRoCk

3
bu bana tuhaf geliyor, neden doğrudan arayabilirseniz ana işlevi tüm bunlara sarmalıyım main()?
Charlie Parker

2
hAcKnRoCk: dosyada ana yoksa, bunun yerine sys.modules [' main '] .main içindeki her şeyi kullanır . Sys.exit komutu, bu şekilde bulunan ana komutu çalıştırmak için kullanılan argları ve bayrakları kullanarak ve main'nin dönüş değeriyle çıkmak anlamına gelir. @CharlieParker - Google'ın gflags ve google-apputils gibi mevcut python uygulama kitaplıklarıyla uyumluluk için. Örneğin, bkz. Github.com/google/google-apputils
dga

8

Ö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.


5

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 argparsebirlikte, 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 .mainargv

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 mainnormal CPython kullanılarak çalıştırılandan daha iyi bir işlev çalışması gerçekleştirip gerçekleştirmediğinden emin değilim .


2

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.


1

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_v2dönüştürmek 1.xiçin kullanabilirsiniz 2.0.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.