目录
1.2.2ArgumentParser.add_argument()
讲个故事:小Q和大A
小Q:命令行参数是什么?
大A:命令行参数是通过命令行(或终端)传递给程序的值,用于配置程序的行为或提供程序所需的输入信息。在许多编程语言中,包括 Python,这些参数可以在程序运行时通过相应的库或模块进行解析和处理。
在命令行中,参数通常以一定的格式出现,例如:
python script.py --input_file data.txt --output_dir results --verbose
在这个例子中,
--input_file
、--output_dir
和--verbose
都是命令行参数,它们后面跟着相应的值或标志。
命令行参数 值或标志 --input_file
data.txt
: 这是一个带有参数值的参数,表示输入文件的名称是data.txt
--output_dir
results
: 同样是一个带有参数值的参数,表示输出目录为results
--verbose
这是一个标志参数,通常表示在程序运行时输出详细的信息,而不需要附加值
总而言之,命令行参数需要在命令行(或终端)使用的参数。
小Q:命令行参数的概念我懂了,那么命令行参数究竟该怎么定义呢?
大A:参数解析器(Argument Parser)是用于处理命令行参数的工具,它允许你定义和解析命令行输入。在Python中,argparse
是一个python常用的模块,用于创建参数解析器,定义命令行参数,并解析用户输入。
1.argparse模块
1.1argparse模块概念与应用
argparse 模块是 Python 内置的一个用于命令项选项与参数解析的模块,可以让人轻松编写用户友好的命令行接口。通过在程序中定义好我们需要的参数,然后 argparse 将会从 sys.argv 解析出这些参数。argparse 模块还会自动生成帮助和使用手册,并在用户给程序传入无效参数时报出错误信息。
以下是使用argparse模块的四个步骤::
1、创建一个解析器对象——创建 ArgumentParser() 对象
2、添加命令行参数——调用 add_argument() 方法添加参数
3、解析命令行参数——使用 parse_args() 解析添加的参数
4、使用命令行参数——使用'对象.参数'的方式调用参数的值
1)创建 ArgumentParser 对象:
import argparse
parser = argparse.ArgumentParser(description='Description of your program')
这里创建了一个 ArgumentParser
对象,可以在构造函数中提供程序的描述性文本。
2)定义命令行参数:
使用 add_argument
方法来定义需要的命令行参数。例如:
parser.add_argument('--input_file', type=str, help='Path to input file')
parser.add_argument('--output_dir', type=str, default='output', help='Path to output directory')
这里定义了两个参数,--input_file
和 --output_dir
,分别用于指定输入文件的路径和输出目录的路径。
3)解析命令行参数:
使用 parse_args
方法解析命令行参数,并得到一个包含用户输入的命名空间(namespace)对象:
args = parser.parse_args()
这里的 args
对象包含了用户提供的命令行参数的值。
4)使用命令行参数的值:
通过访问 args
对象的属性来获取命令行参数的值。例如:
input_file_path = args.input_file
output_dir_path = args.output_dir
在这里,input_file_path
和 output_dir_path
分别包含了用户提供的 --input_file
和 --output_dir
参数的值。
举个栗子:
""" 四个步骤: 1、创建一个解析器对象——创建 ArgumentParser() 对象 2、添加参数——调用 add_argument() 方法添加参数 3、解析参数——使用 parse_args() 解析添加的参数 4、使用参数——使用'对象.参数'的方式调用参数的值 """ import argparse parser = argparse.ArgumentParser() parser.add_argument('--learning_rate', type=float, default=0.01, help='Learning rate for the model') args = parser.parse_args() print(args.learning_rate)
运行结果:
在这个例子中,我们定义了一个命令行参数 --learning_rate,它的类型是浮点数,默认值是 0.01。然后我们解析命令行参数,并将结果赋给 args。最后,我们可以通过 args.learning_rate 来访问这个命令行参数的值。
1.2argparse重要方法
1.2.1ArgumentParser 对象
创建一个新的 ArgumentParser 对象。所有的参数都应当作为关键字参数传入。每个参数在下面都有它更详细的描述,但简而言之,它们是:
|
1.2.2ArgumentParser.add_argument()
定义单个的命令行参数应当如何解析。每个形参都在下面有它自己更多的描述,长话短说有:
ArgumentParser.add_argument(name or flags...[, action][, nargs][, const][, default][, type][, choices][, required][, help][, metavar][, dest]) | ||||||||||||||||||||||||||||||||||||
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
|
add_argument() 方法必须知道是要接收一个可选参数,如 -f
或 --foo
,还是一个位置参数,如由文件名组成的列表。 因此首先传递给 add_argument() 的参数必须是一组旗标,或一个简单的参数名称。(name or flags 的定义决定了后续命令行参数如何运行)
例如,可以这样创建可选参数:
>>> parser.add_argument('-f', '--foo')
而位置参数可以这么创建:
>>> parser.add_argument('bar')
当 parse_args()被调用,选项会以 -
前缀识别,剩下的参数则会被假定为位置参数:
>>> parser = argparse.ArgumentParser(prog='PROG')
>>> parser.add_argument('-f', '--foo')
>>> parser.add_argument('bar')
>>> parser.parse_args(['BAR'])
Namespace(bar='BAR', foo=None)
>>> parser.parse_args(['BAR', '--foo', 'FOO'])
Namespace(bar='BAR', foo='FOO')
>>> parser.parse_args(['--foo', 'FOO'])
usage: PROG [-h] [-f FOO] bar
PROG: error: the following arguments are required: bar
2)action
ArgumentParser 对象将命令行参数与动作相关联。这些动作可以做与它们相关联的命令行参数的任何事,尽管大多数动作只是简单的向 parse_args() 返回的对象上添加属性。action
命名参数指定了这个命令行参数应当如何处理。供应的动作有:
- 'store' - 存储参数的值。这是默认的动作。例如:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo')
>>> parser.parse_args('--foo 1'.split())
Namespace(foo='1')
- 'store_const' - 存储由 const 关键字参数指定的值;请注意 const 关键字参数默认为 None。
'store_const' 动作最常被用于指定某类旗标的可选参数。 例如:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', action='store_const', const=42)
>>> parser.parse_args(['--foo'])
Namespace(foo=42)
除此之外,供应的动作还有'store_true', 'append', 'appeed_const','count', 'help', 'version', 在此就不一一赘述了,有兴趣的同学可以查看action。
默认情况下,解析器会将命令行参数当作简单字符串读入。 然而,命令行字符串经常应当被解读为其他类型,例如 float 或 int。 add_argument()的 type
关键字允许执行任何必要的类型检查和类型转换。
如果 type 关键字使用了 default 关键字,则类型转换器仅会在默认值为字符串时被应用。
传给 type 的参数可以是任何接受单个字符串的可调用对象。 如果函数引发了ArgumentTypeError,TypeError,ValueError 异常会被捕获并显示经过良好格式化的错误消息。 其他异常类型则不会被处理。
普通内置类型和函数可被用作类型转换器:
>>> parser = argparse.ArgumentParser(prog='game.py')
>>> parser.add_argument('move', choices=['rock', 'paper', 'scissors'])
>>> parser.parse_args(['rock'])
Namespace(move='rock')
>>> parser.parse_args(['fire'])
usage: game.py [-h] {rock,paper,scissors}
game.py: error: argument move: invalid choice: 'fire' (choose from 'rock',
'paper', 'scissors')
4)help
help
值是一个包含参数简短描述的字符串。 当用户请求帮助时(一般是通过在命令行中使用 -h
或 --help
的方式),这些 help
描述将随每个参数一同显示:
>>> parser = argparse.ArgumentParser(prog='frobble')
>>> parser.add_argument('--foo', action='store_true',
help='foo the bars before frobbling')
>>> parser.add_argument('bar', nargs='+',
help='one of the bars to be frobbled')
>>> parser.parse_args(['-h'])
usage: frobble [-h] [--foo] bar [bar ...]
positional arguments:
bar one of the bars to be frobbled
options:
-h, --help show this help message and exit
--foo foo the bars before frobbling
5)default
所有选项和一些位置参数可能在命令行中被忽略。add_argument() 的命名参数 default
,默认值为 None
,指定了在命令行参数未出现时应当使用的值。对于选项, default
值在选项未在命令行中出现时使用:
>>> parser = argparse.ArgumentParser()
>>> parser.add_argument('--foo', default=42)
>>> parser.parse_args(['--foo', '2'])
Namespace(foo='2')
>>> parser.parse_args([])
Namespace(foo=42)
想了解更多其余参数的请查看add_argument() 方法
2.argparse 模块在深度学习的应用
了解了argparse 模块的概念和应用,下面我们来进一步学习argparse 模块在深度学习的应用。下面定义了一个简单的深度学习模型案例进行演示:
import argparse
import torch
import torch.nn as nn
import torch.optim as optim
class SimpleModel(nn.Module):
def __init__(self, input_size, hidden_size, output_size):
super(SimpleModel, self).__init__()
self.fc1 = nn.Linear(input_size, hidden_size)
self.relu = nn.ReLU()
self.fc2 = nn.Linear(hidden_size, output_size)
def forward(self, x):
x = self.fc1(x)
x = self.relu(x)
x = self.fc2(x)
return x
def train(model, train_data, optimizer, criterion):
# 训练逻辑
pass
def main(args):
# 创建模型
model = SimpleModel(args.input_size, args.hidden_size, args.output_size)
# 定义损失函数和优化器
criterion = nn.CrossEntropyLoss()
optimizer = optim.Adam(model.parameters(), lr=args.learning_rate)
# 进行训练
train(model, args.train_data, optimizer, criterion)
if __name__ == "__main__":
# 创建参数解析器
parser = argparse.ArgumentParser(description='Simple Deep Learning Model Training')
# 添加模型参数
parser.add_argument('--input_size', type=int, default=10, help='Input size of the model')
parser.add_argument('--hidden_size', type=int, default=20, help='Hidden size of the model')
parser.add_argument('--output_size', type=int, default=5, help='Output size of the model')
# 添加训练参数
parser.add_argument('--learning_rate', type=float, default=0.001, help='Learning rate for training')
parser.add_argument('--train_data', type=str, default='train_data.csv', help='Path to training data')
# 解析命令行参数
args = parser.parse_args()
# 调用主函数
main(args)
在这个例子中,使用了一个简单的前馈神经网络模型 (‘ SimpleModel’
) 作为示例。argparse
用于定义模型的输入大小、隐藏层大小、输出大小等超参数。这些参数可以通过命令行输入进行配置,例如:
python train_model.py --input_size 10 --hidden_size 20 --output_size 5 --learning_rate 0.001 --train_data train_data.csv
通过这样的方式,你可以通过命令行输入配置模型的超参数,而无需直接修改代码。