Як tf.app.run()
робота в Tensorflow перекладає демо?
В tensorflow/models/rnn/translate/translate.py
, є заклик до tf.app.run()
. Як з цим поводиться?
if __name__ == "__main__":
tf.app.run()
Як tf.app.run()
робота в Tensorflow перекладає демо?
В tensorflow/models/rnn/translate/translate.py
, є заклик до tf.app.run()
. Як з цим поводиться?
if __name__ == "__main__":
tf.app.run()
Відповіді:
if __name__ == "__main__":
означає, що поточний файл виконується під оболонкою, а не імпортується як модуль.
tf.app.run()
Як ви бачите через файл 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))
Давайте перервемо рядок за рядком:
flags_passthrough = f._parse_flags(args=args)
Це гарантує, що аргумент, який ви передаєте через командний рядок, є дійсним, наприклад,
python my_model.py --data_dir='...' --max_iteration=10000
насправді ця функція реалізована на основі стандартного argparse
модуля python .
main = main or sys.modules['__main__'].main
Перший main
в правій частині =
- це перший аргумент поточної функції run(main=None, argv=None)
. Хоча sys.modules['__main__']
означає поточний запущений файл (наприклад my_model.py
).
Отже, є два випадки:
У вас немає main
функції в my_model.py
Тоді вам доведеться зателефонуватиtf.app.run(my_main_running_function)
у вас є main
функція в my_model.py
. (В основному це так.)
Останній рядок:
sys.exit(main(sys.argv[:1] + flags_passthrough))
гарантує, що ваш main(argv)
або my_main_running_function(argv)
функція викликається правильно розібраними аргументами.
abseil
якими TF повинен був поглинути abseil.io/docs/python/guides/flags
Це просто дуже швидка обгортка, яка обробляє прапор розбору, а потім відправляє до вашого основного. Дивіться код .
main = main or sys.modules['__main__'].main
і що sys.exit(main(sys.argv[:1] + flags_passthrough))
означає в app.py ?
main()
?
У цьому немає нічого особливого tf.app
. Це просто загальний сценарій вхідної точки , який
Запускає програму за допомогою додаткової функції "main" та списку "argv".
Це не має нічого спільного з нейронними мережами, і він просто викликає головну функцію, передаючи їй будь-які аргументи.
Простіше кажучи, завдання tf.app.run()
полягає в тому, щоб спочатку встановити глобальні прапори для подальшого використання, наприклад:
from tensorflow.python.platform import flags
f = flags.FLAGS
а потім запустіть власну основну функцію з набором аргументів.
Наприклад, у кодовій базі TensorFlow NMT , найперша точка вступу для виконання програми для навчання / умовиводу починається з цього моменту (див. Код нижче)
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)
Після розбору аргументів за argparse
допомогою tf.app.run()
запуску функції "main", яка визначається як:
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)
Отже, встановивши прапори для глобального використання, tf.app.run()
просто запускає ту main
функцію, яку ви передаєте їй, argv
як її параметри.
PS: Як йдеться у відповіді Сальвадора Далі , я думаю, що це лише хороша практика інженерії програмного забезпечення, хоча я не впевнений, чи виконує TensorFlow оптимізований запуск main
функції, ніж це було виконано за допомогою звичайного CPython.
Код Google багато в чому залежить від доступу до глобальних прапорів у бібліотеках / бінарних файлах / скриптах python і так tf.app.run () розбирає ці прапори, щоб створити глобальну стан змінної FLAGs (або щось подібне), а потім викликає python main ( ) як слід.
Якщо у них не було цього виклику на tf.app.run (), користувачі можуть забути зробити розбір FLAG, що призведе до того, що ці бібліотеки / бінарні файли / сценарії не мають доступу до необхідних їм FLAG.
Сумісний відповідь : Якщо ви хочете використовувати tf.app.run()
в Tensorflow 2.0
, ми повинні використовувати команду,
tf.compat.v1.app.run()
або ви можете використовувати tf_upgrade_v2
для перетворення 1.x
коду в 2.0
.
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')
і тоді, якщо ви будете використовуватиtf.app.run()
його, ви налаштуєте речі так, щоб ви могли глобально отримувати доступ до переданих значень визначених вами прапорів, як биtf.flags.FLAGS.batch_size
там, де вам це потрібно у вашому коді.