您的位置:首页 > 移动开发

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

2017-08-21 14:00 393 查看
在看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文件



这里输出了我们赋给命令行参数的值
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: