《深入了解TensorFlow》笔记——Chapter 4.3 命令行参数

命令行参数值启动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中解析器的大量配置选项,仅实现了参数解析、默认值和打印帮助信息等基本功能。

但是由于该模块使用的人非常少,因此这里不做赘述。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Dongz__

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值