Как 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)
функция вызывается с проанализированными аргументами правильно.
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')
и затем, если вы их используете,tf.app.run()
все будет настроено так, чтобы вы могли получить глобальный доступ к переданным значениям флагов, которые вы определили, например,tf.flags.FLAGS.batch_size
из любого места, где это необходимо в вашем коде.abseil
что TF должен был поглотить abseil.io/docs/python/guides/flagsЭто просто очень быстрая оболочка, которая обрабатывает разбор флагов и затем отправляет их на ваш основной. Смотрите код .
источник
main = main or sys.modules['__main__'].main
иsys.exit(main(sys.argv[:1] + flags_passthrough))
среднее?main()
?В этом нет ничего особенного
tf.app
. Это просто общий сценарий точки входа , которыйОн не имеет ничего общего с нейронными сетями и просто вызывает основную функцию, передавая ей любые аргументы.
источник
Проще говоря, задача
tf.app.run()
состоит в том, чтобы сначала установить глобальные флаги для последующего использования, например:а затем запустите свою пользовательскую функцию main с набором аргументов.
Например, в кодовой базе TensorFlow NMT самая первая точка входа для выполнения программы для обучения / вывода начинается в этой точке (см. Код ниже)
После анализа аргументов с помощью
argparse
,tf.app.run()
вы запускаете функцию "main", которая определяется как:Итак, после установки флагов для глобального использования,
tf.app.run()
просто запускаетmain
функцию, которую вы передадите ей вargv
качестве параметров.PS: ответ Сальвадора Дали говорит, что это просто хорошая практика разработки программного обеспечения, я думаю, хотя я не уверен, выполняет ли TensorFlow какой-либо оптимизированный запуск
main
функции, который выполнялся с использованием обычного CPython.источник
Код Google во многом зависит от доступа к глобальным флагам в библиотеках / binaries / python, поэтому tf.app.run () анализирует эти флаги для создания глобального состояния в переменной FLAG (или чего-то подобного) и затем вызывает python main ( ) как это должно.
Если у них не было этого вызова tf.app.run (), то пользователи могут забыть выполнить анализ FLAG, что приведет к тому, что у этих библиотек / двоичных файлов / скриптов не будет доступа к нужным им FLAG.
источник
2.0 совместимый ответ : если вы хотите использовать
tf.app.run()
вTensorflow 2.0
, мы должны использовать команду,tf.compat.v1.app.run()
или вы можете использоватьtf_upgrade_v2
для преобразования1.x
кода в2.0
.источник