tf.app.run()
Tensorflowの翻訳デモではどのように機能しますか?
ではtensorflow/models/rnn/translate/translate.py
、への呼び出しがありtf.app.run()
ます。それはどのように扱われますか?
if __name__ == "__main__":
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
実際には、この機能はPython標準argparse
モジュールに基づいて実装されています。
main = main or sys.modules['__main__'].main
の最初のmain
右側=
は、現在の関数の最初の引数ですrun(main=None, argv=None)
。While sys.modules['__main__']
は、現在実行中のファイルを意味します(例:)my_model.py
。
したがって、2つのケースがあります。
には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
次に、一連の引数を使用してカスタムmain関数を実行します。
たとえば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)
を使用して引数を解析した後、次のように定義された関数「main」を実行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
。
PS:サルバドールダリの答えが言うように、それはソフトウェアエンジニアリングの優れた実践にすぎないと思いますが、TensorFlowがmain
関数の最適化された実行を通常のCPythonを使用して実行されたものより実行するかどうかはわかりません。
Googleコードは、libraries / binaries / pythonスクリプトでアクセスされているグローバルフラグに大きく依存しているため、tf.app.run()はこれらのフラグを解析して、FLAGs(または同様の)変数にグローバルステートを作成し、次に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
。
tf.flags.DEFINE_integer('batch_size', 128, 'Number of images to process in a batch.')
それを使用tf.app.run()
するとtf.flags.FLAGS.batch_size
、コード内のどこからでも、定義したフラグの渡された値にグローバルにアクセスできるように設定されます。