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()
źródło
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()
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.
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.abseil
które TF musiał wchłonąć abseil.io/docs/python/guides/flagsTo tylko bardzo szybkie opakowanie, które obsługuje parsowanie flag, a następnie wysyła je do własnego pliku main. Zobacz kod .
źródło
main = main or sys.modules['__main__'].main
i cosys.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óryNie ma to nic wspólnego z sieciami neuronowymi i po prostu wywołuje funkcję główną, przekazując do niej wszelkie argumenty.
źródło
Mówiąc najprościej, zadaniem programu
tf.app.run()
jest najpierw ustawienie flag globalnych do późniejszego użycia, takich jak: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)
Po przeanalizowaniu argumentów za pomocą
argparse
,tf.app.run()
uruchom funkcję "main", która jest zdefiniowana następująco:Tak więc, po ustawieniu flag do użytku globalnego,
tf.app.run()
po prostu uruchamia tęmain
funkcję, którą przekazujesz muargv
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.źródło
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.
źródło
Zgodna odpowiedź 2.0 : Jeśli chcesz użyć
tf.app.run()
wTensorflow 2.0
, powinniśmy użyć polecenia,tf.compat.v1.app.run()
lub możesz użyćtf_upgrade_v2
do konwersji1.x
kodu na2.0
.źródło