programing tip

tf.app.run ()은 어떻게 작동합니까?

itbloger 2020. 6. 25. 21:27
반응형

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 code depends on a lot on global flags being accessing in libraries/binaries/python scripts and so tf.app.run() parses out those flags to create a global state in FLAGs(or something similar) variable and then calls python main() as it should.

If they didn't have this call to tf.app.run(), then users might forget to do FLAGs parsing, leading to these libraries/binaries/scripts not having access to FLAGs they need.

참고URL : https://stackoverflow.com/questions/33703624/how-does-tf-app-run-work

반응형