TensorFlow 中 tf.app.flags 的目的是啥?

Posted

技术标签:

【中文标题】TensorFlow 中 tf.app.flags 的目的是啥?【英文标题】:What's the purpose of tf.app.flags in TensorFlow?TensorFlow 中 tf.app.flags 的目的是什么? 【发布时间】:2016-02-29 05:03:23 【问题描述】:

我正在阅读 Tensorflow 中的一些示例代码,我发现以下代码

flags = tf.app.flags
FLAGS = flags.FLAGS
flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')
flags.DEFINE_integer('max_steps', 2000, 'Number of steps to run trainer.')
flags.DEFINE_integer('hidden1', 128, 'Number of units in hidden layer 1.')
flags.DEFINE_integer('hidden2', 32, 'Number of units in hidden layer 2.')
flags.DEFINE_integer('batch_size', 100, 'Batch size.  '
                 'Must divide evenly into the dataset sizes.')
flags.DEFINE_string('train_dir', 'data', 'Directory to put the training data.')
flags.DEFINE_boolean('fake_data', False, 'If true, uses fake data '
                 'for unit testing.')

tensorflow/tensorflow/g3doc/tutorials/mnist/fully_connected_feed.py

但我找不到任何关于tf.app.flags 用法的文档。

我发现这个标志的实现是在 tensorflow/tensorflow/python/platform/default/_flags.py

显然,这个tf.app.flags 以某种方式用于配置网络,那么为什么它不在 API 文档中呢?谁能解释这里发生了什么?

【问题讨论】:

【参考方案1】:

tf.app.flags 模块目前是 python-gflags 的薄包装,因此documentation for that project 是了解如何使用它的最佳资源 argparse,它实现了功能的子集在python-gflags

请注意,此模块目前是为了方便编写演示应用而打包的,从技术上讲,它不是公共 API 的一部分,因此将来可能会发生变化。

我们建议您使用 argparse 或您喜欢的任何库来实现自己的标志解析。

编辑: tf.app.flags 模块实际上并没有使用 python-gflags 实现,但它使用了类似的 API。

【讨论】:

“为了方便编写演示应用而打包,从技术上讲,它不是公共 AP 的一部分”……有点奇怪,它几乎在每个教程中都有使用,但没有关于它的文档。导致很多混乱。 有关如何使用 argparse 将参数传递给 TensorFlow 模型以及如何将其捆绑到云的 Python 模块中的一个很好的示例,请参阅 taxifare 模块中的 task.py 部分的training-data-analyst course materials。 tf.app.run 也不是公共 API 的一部分吗?因为它依赖于 tf.app.flags 并且它有公共文档 (tensorflow.org/api_docs/python/tf/app/run),所以我认为它是公共的并受支持。如果建议改用argparse,您能否提供一个简短示例,说明使用argparse 的推荐方式? 对于 tensorflow 中的所有内容来说,文档都不是问题。【参考方案2】:

tf.app.flags 模块是 Tensorflow 提供的一项功能,用于为您的 Tensorflow 程序实现命令行标志。例如,您遇到的代码将执行以下操作:

flags.DEFINE_float('learning_rate', 0.01, 'Initial learning rate.')

第一个参数定义标志的名称,第二个参数定义默认值,以防在执行文件时未指定标志。

因此,如果您运行以下命令:

$ python fully_connected_feed.py --learning_rate 1.00

然后学习率设置为 1.00,如果未指定标志,将保持 0.01。

如 in this article 所述,文档可能不存在,因为这可能是 Google 内部要求其开发人员使用的东西。

另外,正如文章中提到的,使用 Tensorflow 标志比其他 Python 包(例如 argparse)提供的标志功能有几个优点,尤其是在处理 Tensorflow 模型时,最重要的是您可以提供特定于 Tensorflow 的信息到代码,例如有关使用哪个 GPU 的信息。

【讨论】:

第三个参数是什么意思?可能它就像小的文档字符串。很想知道我是否错了。【参考方案3】:

简答:

在 Google,他们使用标志系统来设置参数的默认值。它类似于 argparse。他们使用自己的标志系统而不是 argparse 或 sys.argv。

资料来源:我以前在那里工作过。

长答案:

对于您在该示例中的参数,它们称为hyperparameters。在神经网络中,您可以优化多个参数以获得所需的结果。例如,对于batch_size,它是可以单次传递给optimizer 的数据向量(可以是图像、文本或原始数据点)的数量。

您可以在 Google 上搜索参数的名称,看看它的用途是什么。如果您想了解深度学习,我建议您参加 Andrew Ng 课程。

【讨论】:

【参考方案4】:

当您使用tf.app.run() 时,您可以使用tf.app.flags 在线程之间非常方便地传递变量。有关tf.app.flags 的进一步用法,请参阅this。

【讨论】:

【参考方案5】:

经过多次尝试,我发现它可以打印所有 FLAGS 键以及实际值 -

for key in tf.app.flags.FLAGS.flag_values_dict():

  print(key, FLAGS[key].value)

【讨论】:

你的意思是 FLAGS[key]

以上是关于TensorFlow 中 tf.app.flags 的目的是啥?的主要内容,如果未能解决你的问题,请参考以下文章

Tensorflow tf.app.flags 的使用

tensorflow学习之——tf.app.flags.DEFINE_XXXX() 使用flags定义命令行参数

tensorflow高级库

TensorFlow命令行参数FLAGS使用

如何用TensorFlow实现线性回归

TensorFlow------TFRecords的读取实例