web-dev-qa-db-ja.com

tf.app.run()はどのように機能しますか?

Tensorflowのtf.app.run()はどのようにデモを変換しますか?

tensorflow/models/rnn/translate/translate.pyには、tf.app.run()の呼び出しがあります。どのように処理されていますか?

if __== "__main__":
    tf.app.run() 
126
Anurag Ranjan
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つのケースがあります。

  1. my_model.pymain関数がありません。その後、tf.app.run(my_main_running_function)を呼び出す必要があります

  2. my_model.pymain関数があります。 (これはほとんどの場合です。)

最終行:

sys.exit(main(sys.argv[:1] + flags_passthrough))

main(argv)またはmy_main_running_function(argv)関数が、解析された引数で適切に呼び出されるようにします。

114
lei du

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

72
dga

tf.app には特別なものはありません。これは単なる 汎用エントリポイントスクリプト です。

オプションの「main」関数と「argv」リストを使用してプログラムを実行します。

ニューラルネットワークとは関係なく、引数を渡してメイン関数を呼び出すだけです。

5
Salvador Dali

簡単に言えば、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関数の最適化された実行を実行するかどうかはわかりませんが。

3
kmario23

Googleコードは、library/binaries/pythonスクリプトでアクセスしているグローバルフラグに大きく依存しているため、tf.app.run()はこれらのフラグを解析してFLAGs(または同様の)変数にグローバル状態を作成し、python main()必要に応じて。

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

1
Mudit Jain