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


150

Как tf.app.run()работает в Tensorflow переводить демо?

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

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

Ответы:


135
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)или my_main_running_function(argv)функция вызывается с проанализированными аргументами правильно.


67
Недостающий фрагмент головоломки для начинающих пользователей Tensorflow: в Tensorflow есть встроенный механизм обработки флагов командной строки. Вы можете определить свои флаги, например, tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')и затем, если вы их используете, tf.app.run()все будет настроено так, чтобы вы могли получить глобальный доступ к переданным значениям флагов, которые вы определили, например, tf.flags.FLAGS.batch_sizeиз любого места, где это необходимо в вашем коде.
Изаранди

1
Это лучший ответ из (текущих) трех на мой взгляд. В нем объясняется «Как работает tf.app.run ()», а в двух других ответах просто говорится, что он делает.
Томас Фаусканер

Похоже, флаги обрабатываются тем, abseilчто TF должен был поглотить abseil.io/docs/python/guides/flags
CpILL

75

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


12
что значит "обрабатывает разбор флагов"? Может быть, вы могли бы добавить ссылку, чтобы сообщить новичкам, что это значит?
Буратино

4
Он анализирует аргументы командной строки, предоставленные программе, используя пакет flags. (который использует стандартную библиотеку 'argparse' под обложками, с некоторыми обертками). Это связано с кодом, на который я ссылаюсь в своем ответе.
дга

1
В app.py, что делают main = main or sys.modules['__main__'].mainи sys.exit(main(sys.argv[:1] + flags_passthrough))среднее?
hAcKnRoCk

3
это кажется мне странным, зачем заключать во все это основную функцию, если вы можете просто вызвать ее напрямую main()?
Чарли Паркер

2
hAcKnRoCk: если в файле нет main, вместо этого он использует все, что находится в sys.modules [' main '] .main. Sys.exit означает запустить найденную таким образом основную команду, используя аргументы и любые пройденные флаги, и выйти с возвращенным значением main. @CharlieParker - для совместимости с существующими библиотеками приложений Python от Google, такими как gflags и google-apputils. См., Например, github.com/google/google-apputils
dga,

8

В этом нет ничего особенного tf.app. Это просто общий сценарий точки входа , который

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

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


5

Проще говоря, задача tf.app.run()состоит в том, чтобы сначала установить глобальные флаги для последующего использования, например:

from tensorflow.python.platform import flags
f = flags.FLAGS

а затем запустите свою пользовательскую функцию main с набором аргументов.

Например, в кодовой базе 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.


2

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

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


1

2.0 совместимый ответ : если вы хотите использовать tf.app.run()в Tensorflow 2.0, мы должны использовать команду,

tf.compat.v1.app.run()или вы можете использовать tf_upgrade_v2для преобразования 1.xкода в 2.0.

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.