Як працює tf.app.run ()?


148

Як tf.app.run()робота в Tensorflow перекладає демо?

В tensorflow/models/rnn/translate/translate.py, є заклик до tf.app.run(). Як з цим поводиться?

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

Відповіді:


134
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
Він аналізує аргументи командного рядка, що надходять до програми за допомогою пакету прапорів. (яка використовує стандартну бібліотеку 'argparse' під обкладинками, з деякими обгортками). Це посилання з коду, на який я пов’язаний у своїй відповіді.
день

1
Що означає main = main or sys.modules['__main__'].mainі що sys.exit(main(sys.argv[:1] + flags_passthrough))означає в app.py ?
hAcKnRoCk

3
мені це здається дивним, навіщо вкривати головну функцію у всьому, що якщо ви можете просто назвати її безпосередньо main()?
Чарлі Паркер

2
hAcKnRoCk: якщо у файлі немає головного, він замість цього використовує те, що є у sys.modules [' main '] .main. Sys.exit означає запустити головну команду, знайдену таким чином, за допомогою аргументів і будь-яких прапорів, що пройшли, і вийти зі значенням повернення main. @CharlieParker - для сумісності з існуючими бібліотеками додатків python, такими як gflags та google-apputils. Дивіться, наприклад, github.com/google/google-apputils
16:11

8

У цьому немає нічого особливого tf.app. Це просто загальний сценарій вхідної точки , який

Запускає програму за допомогою додаткової функції "main" та списку "argv".

Це не має нічого спільного з нейронними мережами, і він просто викликає головну функцію, передаючи їй будь-які аргументи.


5

Простіше кажучи, завдання 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.


2

Код Google багато в чому залежить від доступу до глобальних прапорів у бібліотеках / бінарних файлах / скриптах python і так tf.app.run () розбирає ці прапори, щоб створити глобальну стан змінної FLAGs (або щось подібне), а потім викликає python main ( ) як слід.

Якщо у них не було цього виклику на tf.app.run (), користувачі можуть забути зробити розбір FLAG, що призведе до того, що ці бібліотеки / бінарні файли / сценарії не мають доступу до необхідних їм FLAG.


1

Сумісний відповідь : Якщо ви хочете використовувати 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.