Jak tf.app.run()
działa w Tensorflow tłumaczyć demo?
W tensorflow/models/rnn/translate/translate.py
, jest wezwanie tf.app.run()
. Jak to jest obsługiwane?
if __name__ == "__main__":
tf.app.run()
Jak tf.app.run()
działa w Tensorflow tłumaczyć demo?
W tensorflow/models/rnn/translate/translate.py
, jest wezwanie tf.app.run()
. Jak to jest obsługiwane?
if __name__ == "__main__":
tf.app.run()
Odpowiedzi:
if __name__ == "__main__":
oznacza, że bieżący plik jest wykonywany w powłoce, a nie importowany jako moduł.
tf.app.run()
Jak widać w pliku 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))
Przełammy linię po linii:
flags_passthrough = f._parse_flags(args=args)
Gwarantuje to, że argument, który przekazujesz w wierszu poleceń, jest prawidłowy, np.
python my_model.py --data_dir='...' --max_iteration=10000
W rzeczywistości ta funkcja jest zaimplementowana w oparciu o standardowy argparse
moduł Pythona .
main = main or sys.modules['__main__'].main
Pierwszy main
po prawej stronie =
jest pierwszym argumentem bieżącej funkcji run(main=None, argv=None)
. Podczas gdy sys.modules['__main__']
oznacza aktualnie uruchomiony plik (np my_model.py
.).
Są więc dwa przypadki:
Nie masz main
funkcji my_model.py
W takim razie musisz zadzwonićtf.app.run(my_main_running_function)
masz main
funkcję w my_model.py
. (Tak jest głównie).
Ostatnia linia:
sys.exit(main(sys.argv[:1] + flags_passthrough))
zapewnia prawidłowe wywołanie funkcji main(argv)
lub my_main_running_function(argv)
z przeanalizowanymi argumentami.
abseil
które TF musiał wchłonąć abseil.io/docs/python/guides/flags
To tylko bardzo szybkie opakowanie, które obsługuje parsowanie flag, a następnie wysyła je do własnego pliku main. Zobacz kod .
main = main or sys.modules['__main__'].main
i co sys.exit(main(sys.argv[:1] + flags_passthrough))
oznacza w app.py ?
main()
?
Nie ma w tym nic specjalnego tf.app
. To tylko ogólny skrypt punktu wejścia , który
Uruchamia program z opcjonalną funkcją „main” i listą „argv”.
Nie ma to nic wspólnego z sieciami neuronowymi i po prostu wywołuje funkcję główną, przekazując do niej wszelkie argumenty.
Mówiąc najprościej, zadaniem programu tf.app.run()
jest najpierw ustawienie flag globalnych do późniejszego użycia, takich jak:
from tensorflow.python.platform import flags
f = flags.FLAGS
a następnie uruchom niestandardową funkcję główną z zestawem argumentów.
Na przykład w bazie kodu TensorFlow NMT pierwszy punkt wejścia do wykonywania programu w celu uczenia / wnioskowania zaczyna się w tym miejscu (patrz poniższy kod)
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)
Po przeanalizowaniu argumentów za pomocą argparse
, tf.app.run()
uruchom funkcję "main", która jest zdefiniowana następująco:
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)
Tak więc, po ustawieniu flag do użytku globalnego, tf.app.run()
po prostu uruchamia tę main
funkcję, którą przekazujesz mu argv
jako parametry.
PS: Jak mówi odpowiedź Salvadora Dali , wydaje mi się, że jest to po prostu dobra praktyka inżynierska oprogramowania, chociaż nie jestem pewien, czy TensorFlow wykonuje zoptymalizowane uruchomienie main
funkcji niż ta, która była uruchamiana przy użyciu zwykłego CPythona.
Kod Google zależy w dużej mierze od globalnych flag dostępnych w bibliotekach / plikach binarnych / skryptach Pythona, dlatego tf.app.run () analizuje te flagi, aby utworzyć stan globalny w zmiennej FLAG (lub podobnej), a następnie wywołuje python main ( ) jak powinno.
Jeśli nie mieli wywołania tf.app.run (), użytkownicy mogliby zapomnieć o parsowaniu plików FLAG, co prowadzi do tego, że te biblioteki / pliki binarne / skrypty nie mają dostępu do potrzebnych im grup FLAG.
Zgodna odpowiedź 2.0 : Jeśli chcesz użyć tf.app.run()
w Tensorflow 2.0
, powinniśmy użyć polecenia,
tf.compat.v1.app.run()
lub możesz użyć tf_upgrade_v2
do konwersji 1.x
kodu na 2.0
.
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')
a następnie, jeślitf.app.run()
go użyjesz , skonfigurujesz rzeczy tak, abyś mógł globalnie uzyskać dostęp do przekazanych wartości flag, które zdefiniowałeś, na przykładtf.flags.FLAGS.batch_size
z dowolnego miejsca w swoim kodzie.