Tensorflowのtf.app.run()
はどのようにデモを変換しますか?
tensorflow/models/rnn/translate/translate.py
には、tf.app.run()
の呼び出しがあります。どのように処理されていますか?
if __== "__main__":
tf.app.run()
if __== "__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
実際、この機能はpython標準argparse
モジュールに基づいて実装されています。
main = main or sys.modules['__main__'].main
=
の右側の最初のmain
は、現在の関数run(main=None, argv=None)
の最初の引数です。 sys.modules['__main__']
は現在実行中のファイルを意味します(例:my_model.py
)。
したがって、2つのケースがあります。
my_model.py
にmain
関数がありません。その後、tf.app.run(my_main_running_function)
を呼び出す必要があります
my_model.py
にmain
関数があります。 (これはほとんどの場合です。)
最終行:
sys.exit(main(sys.argv[:1] + flags_passthrough))
main(argv)
またはmy_main_running_function(argv)
関数が、解析された引数で適切に呼び出されるようにします。
これは、フラグの解析を処理してから独自のメインにディスパッチする非常に高速なラッパーです。 code を参照してください。
tf.app
には特別なものはありません。これは単なる 汎用エントリポイントスクリプト です。
オプションの「main」関数と「argv」リストを使用してプログラムを実行します。
ニューラルネットワークとは関係なく、引数を渡してメイン関数を呼び出すだけです。
簡単に言えば、tf.app.run()
の仕事はfirstであり、後で使用するためにグローバルフラグを設定します。
from tensorflow.python.platform import flags
f = flags.FLAGS
次に、一連の引数を使用してcustom main関数を実行します。
たとえば TensorFlow NMT codebaseでは、トレーニング/推論のためのプログラム実行の最初のエントリポイントはこのポイントから始まります(以下のコードを参照)
if __== "__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()
を使用して、次のように定義された関数「main」を実行します。
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
関数を単に実行します。
P.S .: Salvador Daliの答え が言っているように、それは単なるソフトウェアエンジニアリングの実践であると思いますが、TensorFlowが通常のCPythonを使用して実行されたものよりもmain
関数の最適化された実行を実行するかどうかはわかりませんが。
Googleコードは、library/binaries/pythonスクリプトでアクセスしているグローバルフラグに大きく依存しているため、tf.app.run()はこれらのフラグを解析してFLAGs(または同様の)変数にグローバル状態を作成し、python main()必要に応じて。
Tf.app.run()へのこの呼び出しがなかった場合、ユーザーはFLAGの解析を忘れ、これらのライブラリ/バイナリ/スクリプトが必要なFLAGにアクセスできなくなる可能性があります。