一、引言
argsparse是python的命令行解析的标准模块,内置于python,不需要安装。这个库可以让我们直接在命令行中就可以向程序中传入参数并让程序运行。
在运行深度学习程序时。往往会因为电脑配置不行导致程序运行慢卡,需要将程序在虚机上进行测试代码,而虚机一般没有IDE,只能用命令行来测试代码。
使用argparse模块,你可以定义程序所需的命令行参数和选项,以及它们的类型、默认值、帮助信息等。然后,argparse会解析用户提供的命令行输入,并将其转换为易于使用的Python对象。
二、实现过程
案例
假如我有一个名为20231225.py的Python脚本如下:
import argparse# 创建一个ArgumentParser对象
parser = argparse.ArgumentParser(description='这是一个命令行参数解析的示例程序')
# 添加一个位置参数
parser.add_argument('name', type=str, help='你的名字')
# 添加一个可选参数
parser.add_argument('--age', type=int, default=18, help='你的年龄')
# 解析命令行输入
args = parser.parse_args()
# 打印解析的参数(执行任务)
print('你好,{}!你的年龄是{}'.format(args.name, args.age))
2.1 创建一个ArgumentParser对象
parser = argparse.ArgumentParser(description='这是一个命令行参数解析的示例程序')
创建了一个ArgumentParser对象,并提供了一个描述性的字符串作为参数。
2.2 添加一个位置参数
parser.add_argument('name', type=str, help='你的名字')
在命令行中传入参数时候,如果采用了位置参数,传入的参数的先后顺序不同,运行结果往往会不同,这是name是位置参数。
2.3 添加一个可选参数
parser.add_argument('--age', type=int, default=18, help='你的年龄')
为了在命令行中避免上述位置参数的bug(容易忘了顺序),可以使用可选参数,这个有点像关键词传参,但是需要在关键词前面加--,这里age的关键词传参。
add_argument方法的常用参数如下:name:参数的名称或选项的名称,可以是位置参数(不带前缀)或可选参数(带前缀)。
type:参数的类型。可以是内置类型(如int、float、str等),也可以是自定义类型或函数。
default:参数的默认值。如果用户没有提供该参数,则使用默认值。
help:参数的帮助信息。当用户使用-h或--help选项时,将显示该帮助信息。
required:指定参数是否为必需参数。默认为False,即可选参数。
choices:参数的可选值列表。用户提供的参数必须是该列表中的一个值。
nargs:参数的数量。可以是具体的数字(如1表示一个参数,2表示两个参数),也可以是特殊值(如'+'表示一个或多个参数,'*'表示零个或多个参数)。
action:指定参数的动作。常用的动作包括存储参数值、计数参数出现的次数、将参数值存储为列表等。
2.4 解析命令行输入
args = parser.parse_args()
使用parse_args方法解析命令行输入,并将解析的结果存储在args变量中
2.5 执行任务
print('你好,{}!你的年龄是{}'.format(args.name, args.age))
利用解析出的变量进行任务操作:
总结
在实际的应用过程,一般会将创建ArgumentParser对象、添加参数、解析参数过程写在一个函数中,将任务写在一个函数,如下:
import argparsedef parseArgs():# 创建一个ArgumentParser对象parser = argparse.ArgumentParser(description='这是一个命令行参数解析的示例程序')# 添加一个位置参数parser.add_argument('name', type=str, help='你的名字')# 添加一个可选参数parser.add_argument('--age', '-a', type=int, default=18, help='你的年龄')# 解析命令行输入args = parser.parse_args()return argsdef task(name, age):print('你好,{}!你的年龄是{}'.format(name, age))def main():args = parseArgs()task(args.name, args.age)if __name__ == '__main__':main()
这里-a是短选项(short option)的表示方式。短选项通常由单个字符组成,前面加上一个短横线(减号)作为前缀。短选项用于提供命令行参数的简短表示方式,相比于完整的长选项(long option),它们更加紧凑和方便。例如,使用短选项时,可以将--age表示为-a。运行:
三、机器学习/深度学习的应用场景
argparse库在机器学习或深度学习项目中非常有用,可以提供灵活的命令行参数解析和配置选项,使得程序更易于使用和扩展。通过使用argparse,可以将程序的配置和参数交给用户,使得用户可以通过命令行来控制程序的行为,而不需要修改源代码。以下是一些在这类项目中使用argparse的常见情况:
设置模型超参数(Hyperparameters):机器学习和深度学习模型通常有许多超参数,如学习率、批大小、隐藏层大小等。使用argparse可以允许用户在命令行中指定这些超参数的值,而不需要修改源代码。例如,可以通过命令行参数来指定学习率、迭代次数等。
选择数据集和数据预处理选项: 在机器学习项目中,经常需要从多个数据集中选择一个进行训练和测试。使用argparse可以让用户在命令行中指定数据集的路径或名称。此外,还可以提供数据预处理选项,如图像大小、数据增强方法等,以便在命令行中进行灵活配置。
选择模型架构和损失函数: 在深度学习项目中,可以使用argparse来允许用户选择不同的模型架构和损失函数。通过命令行参数,用户可以指定使用的网络模型(如CNN、RNN、Transformer等)以及损失函数的类型(如交叉熵、均方误差等)。
控制训练和评估过程: 使用argparse可以提供命令行参数来控制训练和评估过程的行为。例如,可以指定训练时是否启用 GPU 加速、是否保存模型权重、是否进行交叉验证等。这样用户可以根据实际需求在命令行中灵活配置程序的行为。
四、机器学习/深度学习的应用例子
假设你正在开发一个图像分类器,使用卷积神经网络(CNN)进行训练和预测。你希望用户能够通过命令行指定一些参数,例如数据集路径、模型超参数和训练配置等。下面是一个简化的例子:
import argparsedef train_model(dataset_path, num_epochs, learning_rate):# 在这里实现训练模型的逻辑passdef parseArgs():# 创建 ArgumentParser 对象parser = argparse.ArgumentParser(description='Image Classifier')# 添加命令行参数parser.add_argument('--dataset', '-d', type=str, required=True, help='Path to the dataset')parser.add_argument('--epochs', '-e', type=int, default=10, help='Number of epochs')parser.add_argument('--learning-rate', '-lr', type=float, default=0.001, help='Learning rate')# 解析命令行输入args = parser.parse_args()return argsdef main():# 解析命令行参数args = parseArgs()# 调用训练函数,并传入命令行参数train_model(args.dataset, args.epochs, args.learning_rate)if __name__ == '__main__':main()
在上面的例子中,我们使用argparse创建了一个ArgumentParser对象,并添加了三个命令行参数:--dataset、--epochs和--learning-rate。其中,--dataset是必需的参数,而--epochs和--learning-rate是可选参数,并且具有默认值。我们还为每个参数提供了简短的选项,如-d、-e和-lr。用户可以通过命令行来运行这个脚本,并指定数据集路径、训练轮数和学习率等参数。例如:
python image_classifier.py --dataset data/ --epochs 20 --learning-rate 0.01
通过这种方式,用户可以在不修改源代码的情况下,通过命令行灵活地配置图像分类器的训练过程。
作者简介:
读研期间发表6篇SCI数据挖掘相关论文,现在某研究院从事数据算法相关科研工作,结合自身科研实践经历不定期分享关于Python、机器学习、深度学习、人工智能系列基础知识与应用案例。致力于只做原创,以最简单的方式理解和学习,关注我一起交流成长。需要数据集和源码的小伙伴可以关注底部公众号添加作者微信!