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

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

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

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

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

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

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

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

这里是import了argparse as _argparse

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

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

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

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

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


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

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

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

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

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

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

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

举个栗子

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

[python] view plain copy
  1. import tensorflow  as tf  
  2. FLAGS=tf.app.flags.FLAGS  
  3. tf.app.flags.DEFINE_float(  
  4.     'flag_float'0.01'input a float')  
  5. tf.app.flags.DEFINE_integer(  
  6.     'flag_int'400'input a int')  
  7. tf.app.flags.DEFINE_boolean(  
  8.     'flag_bool'True'input a bool')  
  9. tf.app.flags.DEFINE_string(  
  10.     'flag_string''yes''input a string')  
  11.   
  12. print(FLAGS.flag_float)  
  13. print(FLAGS.flag_int)  
  14. print(FLAGS.flag_bool)  
  15. print(FLAGS.flag_string)  


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


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

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

2.直接运行test.py

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

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

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

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

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