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実際には、この機能はPython標準argparseモジュールに基づいて実装されています。

main = main or sys.modules['__main__'].main

の最初のmain右側=は、現在の関数の最初の引数ですrun(main=None, argv=None) 。While sys.modules['__main__']は、現在実行中のファイルを意味します(例:)my_model.py

したがって、2つのケースがあります。

  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 2017年

1
これは、私の意見では(現在の)3人の方が良い答えです。「tf.app.run()はどのように機能するのか」を説明していますが、他の2つの答えは単にそれが何をするのかを示しています。
Thomas Fauskanger 2017年

フラグは、abseilTFがabseil.io/docs/python/guides/flags
CpILL

75

これは、フラグの解析を処理し、独自のメインにディスパッチする非常に迅速なラッパーです。コードを参照してください。


12
「フラグ解析を処理する」とはどういう意味ですか?多分あなたは初心者にそれが何を意味するかを知らせるためにリンクを追加することができますか?
ピノキオ

4
フラグパッケージを使用して、プログラムに提供されたコマンドライン引数を解析します。(これは、いくつかのラッパーを使用して、カバーの下で標準の「argparse」ライブラリを使用します)。私の回答でリンクしたコードからリンクされています。
dga

1
app.pyでは、何 main = main or sys.modules['__main__'].mainsys.exit(main(sys.argv[:1] + flags_passthrough))平均?
hAcKnRoCk

3
これは私には奇妙に思われますが、直接呼び出すことができるのになぜメイン関数をすべてラップするのmain()ですか?
チャーリーパーカー

2
hAcKnRoCk:ファイルにメインがない場合は、代わりにsys.modules [' main '] .mainにあるものを使用します。sys.exitは、渡された引数とフラグを使用して検出されたメインコマンドを実行し、メインの戻り値で終了することを意味します。@CharlieParker-gflagsやgoogle-apputilsなどのGoogleの既存のpythonアプリライブラリとの互換性のため。たとえば、github.com / google / google
dgaを


5

簡単に言うと、の役割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」を実行argparsetf.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を使用して実行されたものより実行するかどうかはわかりません。


2

Googleコードは、libraries / binaries / pythonスクリプトでアクセスされているグローバルフラグに大きく依存しているため、tf.app.run()はこれらのフラグを解析して、FLAGs(または同様の)変数にグローバルステートを作成し、次にpython main(を呼び出します)それがあるべきです。

このtf.app.run()への呼び出しがない場合、ユーザーはFLAGの解析を忘れ、これらのライブラリー/バイナリー/スクリプトが必要なFLAGにアクセスできない可能性があります。


1

2.0互換性のある回答:あなたが使用したい場合tf.app.run()にはTensorflow 2.0、我々はコマンドを使用する必要があり、

tf.compat.v1.app.run()またはtf_upgrade_v21.xコードをに変換するために使用できます2.0

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.