어떻게 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
.
따라서 두 가지 경우가 있습니다.
-
에
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)
함수가 올바르게 호출 되도록하십시오 .
답변
플래그 구문 분석을 처리 한 다음 자신의 메인으로 디스패치하는 매우 빠른 래퍼입니다. 코드를 참조하십시오 .
답변
에 특별한 것은 없습니다 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을 사용하여 실행 된 것보다 함수 의 최적화 된 실행을 수행하는지 여부는 확실하지 않습니다 .
답변
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.x
2.0