tf.app.flags.DEFINE_string()和tf.app.flags.FLAGS

本文深入解析TensorFlow中tf.app.flags模块的使用方法,包括如何定义命令行参数及其默认值,并通过示例展示了如何读取这些参数。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在看SSD的TensorFlow源码(链接点击打开链接)时遇到了这tf.app.flags.DEFINE_string()函数和tf.app.flags.FLAGS变量,于是翻阅TensorFlow官网API结果竟然是。。。

真是相当于白说,意思还是让我自己看源码。。。。。。。

于是上网找,还是找到了Stack Overflow里的一个解答点击打开链接


答案说其实这个,很多时候看TensorFlow的API文档不如看TensorFlow的源码更容易(真的么。。。),所以答主经常用pycharm打开TensorFlow源码的工程,这样能方便的找到答案。比如说你看要看 tensorflow/python/platform/flags.py其实是个披着很薄的装饰的argparse.ArgumentParse()(什么是python的argparse,请看这里点击打开链接),所以也还是得看python的argparse的API文档。

好吧,在我辛苦弄懂argparse也就是一个方便用户添加命令行的玩意之后,问题终于明了了。

我抽取了flags.py的几段程序

这里是import了argparse as _argparse


然后建立argparse一个全局对象_global_parser


定义了_FlagValues这个类,并使用前面定义的全局对象_global_parser,将_global_parser里得到的命令行解析出来,使用了parse_known_args()这个函数(具体可从这里查看点击打开链接)返回一个有用的result,和一个无用的unparsed,后面再使用迭代,将命令行传入的命令和数据解析出来以字典的形式放到__dict__的['_flags']这个字典中,这样当要访问命令行输入的命令时,就能使用像tf.app.flag.Flags(Flags后面会提到,是_FlagValues这个类的一个实例)这样的命令了



然后后面在_define_helper函数中调用了_global_parser.add_argument完成对命令行option argument的添加,这里调用_global_parser也就是前面参数解析器的一个实例,也就是说,真正完成对命令行参数添加的是在_define_helper中的_global_parser.add_argument函数,仔细看这个函数的参数,第一个参数时 ‘--’+flag_name这个表示我们定义的命令行参数使用时必须以 ‘--’开头,比如‘--flag_int 9’(具体看后面栗子),而第二个参数是命令行的默认值,因为有时候并没有赋给命令行参数值,这个时候就默认值就发挥作用了,而第三个参数help保存帮助信息(具体可看后面栗子),第四个参数表示限定了赋予命令行参数数据的类型。


看DEFINE_string(),这里则由于_define_helper()最后一个type参数时str,上面我们关于_define_helper的参数的解释,说明DEFINE_string()限定了可选参数输入必须是string,这也就是为什么这个函数定义为DEFINE_string(),同理,DEFINE_int()限定可选参数必须是int,DEFINE_float()限定可选参数必须是float,DEFINE_boolean()限定可选参数必须是bool。


最关键的一步,这里定义了_FlagValues这个类的一个实例,这样的这样当要访问命令行输入的命令时,就能使用像tf.app.flag.Flags这样的操作。


感觉说得很零碎,总结起来的话,tf.app.flags.DEFINE_xxx()就是添加命令行的optional argument(可选参数),而tf.app.flags.FLAGS可以从对应的命令行参数取出参数。

举个栗子

新建test.py文件,并输入如下代码,代码的功能是创建几个命令行参数,然后把命令行参数输出显示

import tensorflow  as tf
FLAGS=tf.app.flags.FLAGS
tf.app.flags.DEFINE_float(
    'flag_float', 0.01, 'input a float')
tf.app.flags.DEFINE_integer(
    'flag_int', 400, 'input a int')
tf.app.flags.DEFINE_boolean(
    'flag_bool', True, 'input a bool')
tf.app.flags.DEFINE_string(
    'flag_string', 'yes', 'input a string')

print(FLAGS.flag_float)
print(FLAGS.flag_int)
print(FLAGS.flag_bool)
print(FLAGS.flag_string)


1.在命令行中查看帮助信息,在命令行输入 python test.py -h



注意红色框中的信息,这个就是我们用DEFINE_XXX添加命令行参数时的第三个参数

2.直接运行test.py


因为没有给对应的命令行参数赋值,所以输出的是命令行参数的默认值。

3.带命令行参数的运行test.py文件


这里输出了我们赋给命令行参数的值




评论 30
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值