Wie übersetzt die tf.app.run()
Arbeit in Tensorflow die Demo?
In tensorflow/models/rnn/translate/translate.py
gibt es einen Anruf bei tf.app.run()
. Wie wird damit umgegangen?
if __name__ == "__main__":
tf.app.run()
Wie übersetzt die tf.app.run()
Arbeit in Tensorflow die Demo?
In tensorflow/models/rnn/translate/translate.py
gibt es einen Anruf bei tf.app.run()
. Wie wird damit umgegangen?
if __name__ == "__main__":
tf.app.run()
Antworten:
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=10000
wird diese Funktion basierend auf dem Python-Standardmodul implementiert argparse
.
main = main or sys.modules['__main__'].main
Das erste main
auf 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:
Sie haben keine main
Funktion in my_model.py
Dann müssen Sie aufrufentf.app.run(my_main_running_function)
Sie haben eine main
Funktion 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.
abseil
denen TF abseil.io/docs/python/guides/flags
Es ist nur ein sehr schneller Wrapper, der das Parsen von Flaggen übernimmt und dann an Ihre eigene Hauptleitung versendet. Siehe den Code .
main = main or sys.modules['__main__'].main
und sys.exit(main(sys.argv[:1] + flags_passthrough))
bedeutet in app.py ?
main()
?
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.
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 main
Funktion aus, die Sie argv
als 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 main
Funktion ausführt , der mit normalem CPython ausgeführt wurde.
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.
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.x
Code in zu konvertieren 2.0
.
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')
Wenn Sie sie verwendentf.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_size
von jedem Ort aus, an dem Sie sie in Ihrem Code benötigen.