Pytorch进阶训练技(五)之argparse调参

发布时间:2026/6/6 14:55:31
Pytorch进阶训练技(五)之argparse调参
在真实的项目中无论是做学术研究还是工业落地我们都会面临一个痛苦的现实有太多超参数需要调节了如学习率、Batch Size、网络层数、权重衰减率等。 如果每次调参都去修改 Python 源代码不仅效率低下、容易出错而且根本无法进行自动化的批量实验。本篇介绍 Python 标准库中功能最强大的命令行解析工具 ——argparse它能让你的 PyTorch 脚本变成一个专业的“可执行程序”。一、argparse的应用场景如果没有命令行解析你只能在代码里硬编码LR0.01BATCH_SIZE32EPOCHS100DATA_PATH/home/user/data/train# … …1.工程落地在生产环境中模型通常在 Linux 服务器上通过 Shell 脚本.sh或 Docker 容器自动化运行。算法工程师需要通过命令行动态传递设备 ID、输入路径等参数不可能手动去改源码。⭐⭐⭐工程铁律生产代码如果还有硬编码路径属于代码缺陷。2.科研实验消融实验Ablation Study控制变量对比不同组件的贡献超参搜索学习率、Batch Size、权重衰减的网格搜索多组实验并行GPU 集群同时跑多个配置你可以写一个简单的 Bash 脚本一行命令跑 10 个实验。⭐⭐⭐科研技巧配合wandb或tensorboard将 argparse 参数自动同步到实验追踪平台生成漂亮的对比表格。二、argparse的工作流1.argparse简介argsparse 是 python的命令行解析的标准模块内置于 python不需要安装。这个库可以让我们直接在命令行中就可以向程序中传入参数。我们可以使用python file.py来运行python文件。而argparse的作用就是将命令行传入的其他参数进行解析、保存和使用。在使用argparse后我们在命令行输入的参数就可以以这种形式python file.py --lr 1e-4 --batch_size 32来完成对常见超参数的设置。2.argparse的核心工作流argparse的使用就像是“注册会员 → 填写资料 → 领会员卡”的过程1.创建解析器实例化ArgumentParser对象。2.添加参数调用add_argument()方法定义你想让外部传入的超参数。3.解析参数调用parse_args()将命令行输入的字符串转换为 Python 对象的属性。# demo.pyimportargparse# 1. 创建ArgumentParser()对象 ———— “一个空箱子”parserargparse.ArgumentParser(descriptionPyTorch Leaf Classification Demo)# 2. 添加参数 ———— ”往箱子里塞格子定义每个格子装什么“parser.add_argument(--lr,typefloat,default1e-3,helplearning rate for optimizer)# 可选参数parser.add_argument(--batch_size,typeint,requiredTrue,helpbatch size for dataloader)# 必选参数parser.add_argument(-o,--output,actionstore_true,helpshows output)# action store_true 会将output参数记录为True# 3. 使用parse_args()解析参数 ———— “从命令行收货把东西分类装好”argsparser.parse_args()# 在后续代码中通过 args.xxx 访问print(f当前使用的学习率:{args.lr})argparse的参数主要可以分为可选参数和必选参数。可选参数就跟我们的lr参数相类似未输入的情况下会设置为默认值。必选参数就跟我们的batch_size参数相类似当我们给参数设置required True后我们就必须传入该参数否则就会报错。3.超参数类型与高级用法在深度学习脚本中超参数的类型五花八门。以下是标准工业写法及如何处理它们。①数字与字符串parser.add_argument(--epochs,typeint,default10,helptotal training epochs)parser.add_argument(--arch,typestr,defaultresnet18,helpmodel architecture)②如何正确处理布尔值 (True / False) 这是错误的写法的 因为在命令行中无论你输入 --use_gpu False 还是 --use_gpu Trueargparse 接收到的都是字符串 False。而在 Python 中任何非空字符串的布尔值都是 True这会导致你的 GPU 开关永远关不掉。 parser.add_argument(--use_gpu,typebool,defaultTrue,helpwhether to use GPU)正确写法使用actionstore_true 默认是 False如果在命令行加了 --use_gpu它就自动变成 True parser.add_argument(--use_gpu,actionstore_true,helpenable GPU training)③限定选项choices有时你只希望用户在有限的几个选项里选比如只能选resnet18或resnet50parser.add_argument(--model,typestr,defaultresnet18,choices[resnet18,resnet50,vit],helpmodel type)三、高效使用argparse修改超参数每个人都有着不同的超参数管理方式在这里我将分享我使用argparse管理超参数的方式。实际项目中我更推荐独立配置模块 批量实验支持的混合模式通常情况下为了使代码更加简洁和模块化将有关超参数的操作写在config.py然后在train.py或者其他文件导入就可以。# config.pyimportargparsedefget_args():parserargparse.ArgumentParser()# 常用超参数组合parser.add_argument(--root_dir,typestr,default./data,helpdataset path)parser.add_argument(--batch_size,typeint,default64,helpbatch size for training)parser.add_argument(--epochs,typeint,default20,helpnumber of total epochs to run)parser.add_argument(--lr,typefloat,default0.01,helpinitial learning rate)parser.add_argument(--momentum,typefloat,default0.9,helpSGD momentum)parser.add_argument(--weight_decay,typefloat,default1e-4,helpweight decay (L2 penalty))parser.add_argument(--seed,typeint,default42,helpseed for initializing training)parser.add_argument(--amp,actionstore_true,helpuse automatic mixed precision)returnparser.parse_args()# train.pyfromconfigimportget_argsdefmain():argsget_args()# ... 训练逻辑 ...if__name____main__:main()批量调参脚本写法# 自动连续跑三个实验分别测试不同的学习率python train.py--lr0.1--batch_size32python train.py--lr0.01--batch_size32python train.py--lr0.001--batch_size64--ampor# run.sh 批量调参科研场景forlrin0.10.010.001;doforbsin3264;do python train.py--lr $lr--batch_size $bs--output_direxp_lr${lr}_bs${bs}done done总结argparse给我们提供了一种新的更加便捷的方式而在一些大型的深度学习库中人们也会使用json、dict、yaml等文件格式去保存超参数进行训练。