Wie funktioniert tf.app.run ()?


148

Wie übersetzt die tf.app.run()Arbeit in Tensorflow die Demo?

In tensorflow/models/rnn/translate/translate.pygibt es einen Anruf bei tf.app.run(). Wie wird damit umgegangen?

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

Antworten:


134
if __name__ == "__main__":

bedeutet, dass die aktuelle Datei unter einer Shell ausgeführt wird, anstatt als Modul importiert zu werden.

tf.app.run()

Wie Sie durch die Datei sehen können 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))

Lassen Sie uns Zeile für Zeile brechen:

flags_passthrough = f._parse_flags(args=args)

Dadurch wird sichergestellt, dass das Argument, das Sie über die Befehlszeile übergeben, gültig ist, z. B. python my_model.py --data_dir='...' --max_iteration=10000wird diese Funktion basierend auf dem Python-Standardmodul implementiert argparse.

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

Das erste mainauf der rechten Seite von =ist das erste Argument der aktuellen Funktion run(main=None, argv=None) . While sys.modules['__main__']bedeutet aktuell laufende Datei (zB my_model.py).

Es gibt also zwei Fälle:

  1. Sie haben keine mainFunktion in my_model.pyDann müssen Sie aufrufentf.app.run(my_main_running_function)

  2. Sie haben eine mainFunktion in my_model.py. (Dies ist meistens der Fall.)

Letzte Linie:

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

stellt sicher, dass Ihre main(argv)oder my_main_running_function(argv)Funktion mit analysierten Argumenten ordnungsgemäß aufgerufen wird.


67
Ein fehlendes Puzzleteil für Tensorflow-Anfänger: Tensorflow verfügt über einen integrierten Mechanismus zur Behandlung von Befehlszeilenflags. Sie können Ihre Flags wie folgt definieren. tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')Wenn Sie sie verwenden tf.app.run(), werden die Einstellungen so eingerichtet, dass Sie global auf die übergebenen Werte der von Ihnen definierten Flags zugreifen können, z. B. tf.flags.FLAGS.batch_sizevon jedem Ort aus, an dem Sie sie in Ihrem Code benötigen.
— Isarandi

1
Dies ist meiner Meinung nach die bessere Antwort der (aktuellen) drei. Es erklärt das "Wie funktioniert tf.app.run ()", während die beiden anderen Antworten nur sagen, was es tut.
— Thomas Fauskanger

Es sieht so aus, als würden die Flags behandelt, mit abseildenen TF abseil.io/docs/python/guides/flags
— CpILL

75

Es ist nur ein sehr schneller Wrapper, der das Parsen von Flaggen übernimmt und dann an Ihre eigene Hauptleitung versendet. Siehe den Code .


12
Was bedeutet "Handles Flag Parsing"? Vielleicht könnten Sie einen Link hinzufügen, um Anfänger darüber zu informieren, was das bedeutet?
— Pinocchio

4
Es analysiert die Befehlszeilenargumente, die dem Programm mit dem Flags-Paket zur Verfügung gestellt werden. (die die Standardbibliothek 'argparse' unter der Decke mit einigen Wrappern verwendet). Es ist mit dem Code verknüpft, mit dem ich in meiner Antwort verknüpft habe.
— dga

1
Was bedeutet main = main or sys.modules['__main__'].mainund sys.exit(main(sys.argv[:1] + flags_passthrough))bedeutet in app.py ?
— hAcKnRoCk

3
das kommt mir komisch vor, warum die Hauptfunktion in all das einwickeln, wenn man es einfach direkt aufrufen kann main()?
— Charlie Parker

2
hAcKnRoCk: Wenn die Datei kein Main enthält, wird stattdessen alles verwendet, was in sys.modules [' main '] .main enthalten ist. Die sys.exit bedeutet, den so gefundenen Hauptbefehl unter Verwendung der Argumente und aller übergebenen Flags auszuführen und mit dem Rückgabewert von main zu beenden. @CharlieParker - für die Kompatibilität mit den vorhandenen Python-App-Bibliotheken von Google wie gflags und google-apputils. Siehe zum Beispiel github.com/google/google-apputils
— dga

8

Es gibt nichts Besonderes in tf.app. Dies ist nur ein generisches Einstiegspunkt-Skript , das

Führt das Programm mit einer optionalen 'Haupt'-Funktion und einer' Argv'-Liste aus.

Es hat nichts mit neuronalen Netzen zu tun und ruft nur die Hauptfunktion auf und leitet alle Argumente an sie weiter.


5

In einfachen Worten besteht die Aufgabe von tf.app.run()darin, zuerst die globalen Flags für die spätere Verwendung zu setzen, wie:

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

Führen Sie dann Ihre benutzerdefinierte Hauptfunktion mit einer Reihe von Argumenten aus.

Zum Beispiel in der TensorFlow NMT- Codebasis beginnt der allererste Einstiegspunkt für die Programmausführung für Training / Inferenz an diesem Punkt (siehe Code unten).

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)

Nachdem Sie die Argumente mit analysiert haben argparse, führen tf.app.run()Sie mit die Funktion "main" aus, die wie folgt definiert ist:

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)

Nachdem Sie die Flags für die globale Verwendung gesetzt haben, führen Sie tf.app.run()einfach die mainFunktion aus, die Sie argvals Parameter an sie übergeben.

PS: Wie Salvador Dalis Antwort sagt, ist es wohl nur eine gute Softwareentwicklungspraxis, obwohl ich nicht sicher bin, ob TensorFlow einen optimierten Lauf der mainFunktion ausführt , der mit normalem CPython ausgeführt wurde.


2

Google-Code hängt stark davon ab, ob globale Flags in Bibliotheken / Binärdateien / Python-Skripten aufgerufen werden. Daher analysiert tf.app.run () diese Flags, um einen globalen Status in FLAGs (oder einer ähnlichen) Variablen zu erstellen, und ruft dann Python main ( ) so wie es sollte.

Wenn sie diesen Aufruf von tf.app.run () nicht hatten, vergessen Benutzer möglicherweise, FLAGs zu analysieren, was dazu führt, dass diese Bibliotheken / Binärdateien / Skripte keinen Zugriff auf die benötigten FLAGs haben.


1

2.0 kompatible Antwort : Wenn Sie verwenden möchten , tf.app.run()in Tensorflow 2.0, sollten wir den Befehl,

tf.compat.v1.app.run()oder Sie können verwenden tf_upgrade_v2, um 1.xCode in zu konvertieren 2.0.

Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.