답변:
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
.
따라서 두 가지 경우가 있습니다.
에 main
기능 이 없으면 my_model.py
다음을 호출해야합니다.tf.app.run(my_main_running_function)
에 main
기능이 my_model.py
있습니다. (대부분의 경우입니다.)
마지막 줄 :
sys.exit(main(sys.argv[:1] + flags_passthrough))
구문 분석 된 인수로 귀하 main(argv)
또는 my_main_running_function(argv)
함수가 올바르게 호출 되도록하십시오 .
abseil
TF가 abseil.io/docs/python/guides/flags를
플래그 구문 분석을 처리 한 다음 자신의 메인으로 디스패치하는 매우 빠른 래퍼입니다. 코드를 참조하십시오 .
main = main or sys.modules['__main__'].main
을 sys.exit(main(sys.argv[:1] + flags_passthrough))
의미합니까?
main()
?
에 특별한 것은 없습니다 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()
실행하면됩니다 .main
argv
추신 : Salvador Dali의 답변에서 알 수 있듯이 , 그것은 훌륭한 소프트웨어 엔지니어링 사례 일뿐입니다 .TensorFlow main
가 정상적인 CPython을 사용하여 실행 된 것보다 함수 의 최적화 된 실행을 수행하는지 여부는 확실하지 않습니다 .
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')
를 다음 과 같이 정의 할 수 있으며 ,tf.app.run()
이를 사용 하면tf.flags.FLAGS.batch_size
코드에서 필요한 곳 과 같이 정의한 플래그의 전달 된 값에 전역 적으로 액세스 할 수 있도록 설정됩니다 .