tf.app.run()如何工作?

Anu*_*jan 140 python python-3.x tensorflow

如何tf.app.run()在Tensorflow中翻译演示?

tensorflow/models/rnn/translate/translate.py,有一个电话tf.app.run().怎么处理?

if __name__ == "__main__":
    tf.app.run() 
Run Code Online (Sandbox Code Playgroud)

小智 122

if __name__ == "__main__":
Run Code Online (Sandbox Code Playgroud)

表示当前文件在shell下执行,而不是作为模块导入.

tf.app.run()
Run Code Online (Sandbox Code Playgroud)

正如你可以看到的文件 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))
Run Code Online (Sandbox Code Playgroud)

让我们一行一行:

flags_passthrough = f._parse_flags(args=args)
Run Code Online (Sandbox Code Playgroud)

这可以确保您通过命令行传递的参数有效,例如, python my_model.py --data_dir='...' --max_iteration=10000实际上,此功能是基于python标准argparse模块实现的.

main = main or sys.modules['__main__'].main
Run Code Online (Sandbox Code Playgroud)

第一个main在右边=是当前函数的第一个参数run(main=None, argv=None) .而sys.modules['__main__']意味着当前正在运行的文件(例如my_model.py).

所以有两种情况:

  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))
Run Code Online (Sandbox Code Playgroud)

确保使用已解析的参数正确调用您的函数main(argv)my_main_running_function(argv)函数.

  • 初学者Tensorflow用户的一个难题:Tensorflow有一些内置的命令行标志处理机制.你可以定义你的标志,如`tf.flags.DEFINE_integer('batch_size',128,'要批量处理的图像数'.)`然后如果你使用`tf.app.run()`它会设置东西这样你就可以在你的代码中从你需要的地方全局访问你定义的标志的传递值,比如`tf.flags.FLAGS.batch_size`. (61认同)

dga*_*dga 74

它只是一个非常快速的包装器,处理标志解析,然后调度到您自己的主.看代码.

  • 什么意思"处理标志解析"?也许你可以添加一个链接来告知初学者这意味着什么? (12认同)
  • 它使用flags包解析提供给程序的命令行参数.(它使用标准的'argparse'库,包含一些包装器).它与我在回答中链接的代码相关联. (4认同)
  • 这对我来说似乎很奇怪,为什么要把main函数包装成所有的东西,如果你可以直接调用它`main()`? (3认同)
  • hAcKnRoCk:如果文件中没有main,它会使用sys.modules ['__ main __'].main中的任何内容.sys.exit意味着运行使用args和任何传递的标志找到的主命令,并以main的返回值退出.@CharlieParker - 兼容谷歌现有的python应用程序库,如gflags和google-apputils.例如,请参阅https://github.com/google/google-apputils (2认同)

Sal*_*ali 7

没什么特别的tf.app.这只是一个普通的切入点脚本,这

使用可选的"main"函数和"argv"列表运行程序.

它与神经网络无关,它只调用main函数,通过任何参数传递给它.


kma*_*o23 6

简单来说,工作tf.app.run()首先设置全局标志以供以后使用,例如:

from tensorflow.python.platform import flags
f = flags.FLAGS
Run Code Online (Sandbox Code Playgroud)

然后使用一组参数运行您的自定义 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)
Run Code Online (Sandbox Code Playgroud)

使用解析参数后argparsetf.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)
Run Code Online (Sandbox Code Playgroud)

因此,在设置全局使用的标志后,tf.app.run()只需运行mainargv作为参数传递给它的函数。

PS:正如萨尔瓦多·达利 (Salvador Dali) 的回答所说,我猜这只是一种很好的软件工程实践,尽管我不确定 TensorFlow 是否会执行任何优化的main函数运行,而不是使用普通 CPython 运行的运行。