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

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)함수가 올바르게 호출 되도록하십시오 .


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코드에서 필요한 곳 과 같이 정의한 플래그의 전달 된 값에 전역 적으로 액세스 할 수 있도록 설정됩니다 .
isarandi

1
이것은 내 의견으로는 (현재) 세 가지에 대한 더 나은 대답입니다. "tf.app.run () 작동 방식"에 대해 설명하고 다른 두 답변은 그 기능을 설명합니다.
Thomas Fauskanger


75

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


12
"핸들 플래그 구문 분석"이란 무엇입니까? 어쩌면 초보자에게 그 의미를 알려주는 링크를 추가 할 수 있습니까?
피노키오

4
flags 패키지를 사용하여 프로그램에 제공된 명령 줄 인수를 구문 분석합니다. (일부 래퍼와 함께 표지 아래 표준 'argparse'라이브러리를 사용합니다). 그것은 내 대답에 연결된 코드에서 연결됩니다.
dga

1
app.py에서 무엇 main = main or sys.modules['__main__'].mainsys.exit(main(sys.argv[:1] + flags_passthrough))의미합니까?
hAcKnRoCk

3
이것은 나에게 이상하게 보인다. 왜 직접 함수를 호출 할 수 있다면 주 함수를 모두 감싸는가 main()?
Charlie Parker

2
hAcKnRoCk : 파일에 main이 없으면 sys.modules [ ' main '] .main 의 내용을 대신 사용합니다 . sys.exit는 args와 전달 된 플래그를 사용하여 찾은 main 명령을 실행하고 main의 반환 값으로 종료하는 것을 의미합니다. @CharlieParker-gflags 및 google-apputils와 같은 Google의 기존 Python 앱 라이브러리와 호환됩니다. 예를 들어, github.com/google/google-apputils
dga


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()당신은 다음과 같이 정의되는 함수 "주"를 실행 :

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을 사용하여 실행 된 것보다 함수 의 최적화 된 실행을 수행하는지 여부는 확실하지 않습니다 .


2

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

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.