命令行参数值启动TF程序时的输入参数。按照功能不同,可以将其分为模型参数和集群参数两种。前者指机器学习和深度学习模型中的框架参数,比如梯度下降的学习率和批数据大小等,主要用于优化模型的训练精度和速度。后者指运行TF分布式任务的集群配置参数,如参数服务器主机地址和工作服务器主机地址等,主要用于设置TF集群。
解析命令行参数的两种主流解决方案:argparse 和 tf.app.flags。前者是python标准库中的命令行参数解析模块,后者是TF基于argparse封装的工具类。
argparse
argparse模块是python标准库提供的用于命令行参数与选项解析的模块。它默认会从sys.argv中解析出我们在程序中事先定义的参数,并触发对应的动作。argparse模块优点:
- 同时支持定位参数和关键字参数的解析
- 自动生成使用方法信息
- 自动生成帮助信息
- 自动抛出错误提示信息
argparse模块的核心是参数解析器(ArgumentParser),简称解析器。用户事先需要项解析器中添加想要解析的参数。在程序启动时,解析器就能从命令行中解析出对应参数。
创建解析器
创建argparse模块中的解析器实例,构造方法的主要输入参数如下:
- prog,程序的文件名
- usage,程序使用方法,默认根据用户店家的参数自动生成
- description,程序功能说明
- epilog,程序描述末尾的补充信息
- add_help:是否为程序添加用于打印帮助信息-h和–help参数
- argument_default:所有参数的全局默认值
示例代码如下:
import argparse
parser = argparse.ArgumentParser(prog='demo', description='A demo program', epilog='the end of usage')
parser.print_help()
# 输出
"""
usage: demo [-h]
A demo program
optional arguments:
-h, --help show this help message and exit
the end of usage
"""
因为我们没有显示设置usage参数,所以程序的使用方法直接基于带解析的参数生成。由于还未向ArgumentParser中添加参数,所以帮助信息里只有-h参数的使用说明。
添加待解析参数
定义待解析参数,并将其正确添加到解析器是最重要的一步。每调用一次ArgumentParser.add_argument(),我们就向解析器中添加一个参数。成功解析命令行参数是,可以触发不同的动作,具体动作由add_argument()方法中的action参数指定。
ArgumentParser.add_argument()主要参数如下:
- name or flags,名称或标记
- action,解析参数成功时触发的动作,包括store, store_const, store_ture/store_false, append, append_cosnt, count, version等
- nargs,待解析参数的个数
- const,action和nargs参数可能使用的常量值
- default,待解析参数的默认值
- type,待解析参数保存的数据类型
- choices,参数可选值集合,用于约束枚举型参数
- required,是否为必须从输入中解析的参数,默认为False
- help,参数功能说明
- dest,解析参数后保存的对象名称。
示例代码如下:
import argparse
parser = argparse.ArgumentParser('demo')
parser.add_argument('--model_path', type=str, required=True,
help='the path of checkpoint file')
parser.add_argument('--model_name', type=str,
choices=['yolov3', 'yolov5', 'fcos'], dest='model')
parser.add_argument('--version', action='version', version='{} v1.0'.format(parser.prog))
parser.print_help()
# 输出
"""
usage: demo [-h] --model_path MODEL_PATH [--model_name {yolov3,yolov5,fcos}]
[--version]
optional arguments:
-h, --help show this help message and exit
--model_path MODEL_PATH
the path of checkpoint file
--model_name {yolov3,yolov5,fcos}
--version show program's version number and exit
"""
解析参数
解析参数就是按照解析器中的参数名称或标记,将参数字符串先分类再匹配的过程。当匹配成功是,解析器会将参数转换为名字空间中的对象。解析器的parse_args方法实现了解析参数字符串的功能。当我们调用ArgumentParser.parse_args()方法时,解析器按照之前通过add_argument()添加的待解析参数属性,创建对象。
完整的参数解析程序tf_argparse.py 如下:
"""tf_argparse.py"""
#!/usr/bin/env python
# coding=utf-8
import argparse
parser = argparse.ArgumentParser('demo')
parser.add_argument('--model_path', type=str, default='/home', required=True,
help='the path of checkpoint file')
parser.add_argument('--model_name', type=str, default='yolov3',
choices=['yolov3', 'yolov5', 'fcos'], dest='model')
parser.add_argument('--version', action='version', version='{} v1.0'.format(parser.prog))
parser.print_help()
args = parser.parse_args()
print(args)
命令行执行代码:
$: python tf_argparse.py --model_path='/home' --model_name='yolov5'
# 输出
"""
usage: demo [-h] --model_path MODEL_PATH [--model_name {yolov3,yolov5,fcos}]
[--version]
optional arguments:
-h, --help show this help message and exit
--model_path MODEL_PATH
the path of checkpoint file
--model_name {yolov3,yolov5,fcos}
--version show program's version number and exit
Namespace(model='yolov5', model_path='/home')
"""
parse_args方法支持解析多种格式的参数字符串。包括–model_path=’/home’、–model_path ‘/home’。同时parse_args方法也会对参数字符串进行输入检查,包括参数数据类型是否有效、关键字参数的标记是否正确等。
在某些情况下,用户输入的命令行参数可能是给级联调用的多个程序使用的。为此,ArgumentParser实现了只解析预定义参数字符串的parse_known_args()方法,他会将解析器中未添加的参数保存在一个字符串列表里,同时返回一个名字空间和一个字符串列表,后者可以直接传输给调用链中的后续程序来解析和使用。
[问]:如何在后续程序中继续解析和使用?
"""tf_argparse.py"""
#!/usr/bin/env python
# coding=utf-8
import argparse
parser = argparse.ArgumentParser('demo')
parser.add_argument('--model_path', type=str, default='/home', required=True,
help='the path of checkpoint file')
parser.add_argument('--model_name', type=str, default='yolov3',
choices=['yolov3', 'yolov5', 'fcos'], dest='model')
parser.add_argument('--version', action='version', version='{} v1.0'.format(parser.prog))
args, unparser = parser.parse_known_args()
print(args)
print(unparser)
命令行执行代码:
$: python tf_argparse.py --model_path='/home' --model_name='yolov5', --name='dzhou'
# 输出
"""
Namespace(model='yolov5', model_path='/home')
['--name', 'dzhou']
"""
tf.app.flags
虽然argparse模块功能强大,但是他对于python新手来说比较复杂,一般程序不需要如此灵活而完备的命令行参数解析机制。因此TF封装了一套基于argparse的参数解析模块——tf.app.flags。该模块简化了argparse中解析器的大量配置选项,仅实现了参数解析、默认值和打印帮助信息等基本功能。
但是由于该模块使用的人非常少,因此这里不做赘述。