[python] 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모듈을 기반으로 구현 됩니다.

main = main or sys.modules['__main__'].main

첫 번째 main의 우측의 =전류 함수의 첫번째 인수이다 run(main=None, argv=None)
. while 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)함수가 올바르게 호출 되도록하십시오 .


답변

플래그 구문 분석을 처리 한 다음 자신의 메인으로 디스패치하는 매우 빠른 래퍼입니다. 코드를 참조하십시오 .


답변

에 특별한 것은 없습니다 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()당신은 다음과 같이 정의되는 함수 “주”를 실행 :

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()실행하면됩니다 .mainargv

추신 : Salvador Dali의 답변에서 알 수 있듯이 , 그것은 훌륭한 소프트웨어 엔지니어링 사례 일뿐입니다 .TensorFlow main가 정상적인 CPython을 사용하여 실행 된 것보다 함수 의 최적화 된 실행을 수행하는지 여부는 확실하지 않습니다 .


답변

Google 코드는 라이브러리 / 바이너리 / 파이썬 스크립트에서 액세스하는 전역 플래그에 의존하므로 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.x2.0


답변