Как работает tf.app.run()?

Как работает tf.app.run() в Tensorflow translate demo?

В tensorflow/models/rnn/translate/translate.py есть вызов tf.app.run(). Как это обрабатывается?

if __name__ == "__main__":
    tf.app.run() 

Ответ 1

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).

Итак, есть два случая:

  1. У вас нет main функции в my_model.py Затем вам нужно вызвать tf.app.run(my_main_running_function)

  2. у вас есть main функция в my_model.py. (Это в основном так.)

Последняя линия:

sys.exit(main(sys.argv[:1] + flags_passthrough))

гарантирует, что ваша main(argv) функция main(argv) или my_main_running_function(argv) вызывается с правильно разобранными аргументами.

Ответ 2

Это просто очень быстрая оболочка, которая обрабатывает разбор флагов, а затем отправляет на ваш основной. См. Код.

Ответ 3

Нет ничего особенного в tf.app. Это просто общая точка входа script, которая

Запускает программу с необязательной функцией "main" и "argv".

Он не имеет ничего общего с нейронными сетями и просто вызывает основную функцию, передавая ему любые аргументы.

Ответ 4

Проще говоря, задача 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.

Ответ 5

Код Google зависит от большого количества глобальных флагов, которые обращаются к скриптам библиотек/двоичных файлов /python, и поэтому tf.app.run() анализирует эти флаги для создания глобального состояния в FLAG (или что-то подобное) переменной, а затем вызывает python main ( ) как это должно.

Если у них не было этого вызова tf.app.run(), пользователи могут забыть разбор FLAGs, что приведет к тому, что эти библиотеки/двоичные файлы/скрипты не будут иметь доступ к FLAG, в которых они нуждаются.