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.