在深度学习方法中我们不可避免地会遇到大量超参数如(batch_size、learning_rate等)。不同的超参数组合可以得到不同的训练/测试结果。所以在训练和测试过程中我们需要不断调整超参数获得理想的结果(炼丹),如果每一次去找分布在不同的函数里的超参数是一个及其麻烦的过程,为了管理大量的超参数提高炼丹效率,出现了许多超参数管理方法,我将自己遇到的朝参管理方法在此记录,方便自己回顾。
1. argparse模块管理超参
argparse 模块是 Python 中用于解析命令行参数的标准库工具。它允许你定义你的脚本应该接受哪些命令行参数,以及这些参数的类型和默认值。通过使用 argparse,你可以轻松地从命令行获取用户输入,并在脚本中使用这些输入。
argparse 帮助你创建一个用户友好的命令行界面,使得你的脚本能够更加灵活地与用户交互。例如,你可以定义脚本接受的选项,设置默认值,提供帮助信息,等等。
1.1 设置超参
假设我们有几个超参数:
我们创建脚本传入参数进行测试:
import argparse
# 创建 ArgumentParser 实例
parser = argparse.ArgumentParser(description="用来介绍parser!!")
# 添加命令行参数
#help用于在命令行中打印“--batch_size”的用法,可以提醒自己和其他使用此程序的人
parser.add_argument('--batch_size', type=int, default=64, help="定义batch")
parser.add_argument('--epoch', type=int, default=200, help="定义训练轮数")
parser.add_argument('--learning_rate', type=float, default=0.001, help="定义学习率")
# 解析命令行参数
args = parser.parse_args()
# 访问命令行参数的值
model_batch_size = args.batch_size
model_epoch = args.epoch
model_learning_rate = args.learning_rate
# 输出batch_size参数的值
print(model_batch_size)
print(model_epoch)
print(model_learning_rate)
输出结果:
1.2 使用命令行管理传参
可以使用help方法查看参数说明:
使用命令行传入参数:
可以看出batch_size和epoch在手动更新参数之后打印修改后的值,learning_rate没有修改保持默认参数。
记录一个错误:文件名不可以与import中的包名一直,会导致python误判导入的包和文件报错:
AttributeError: module 'argparse' has no attribute 'ArgumentParser'
1.3 解析方法
parser.parse_args()
- 解析命令行参数。如果存在未定义在
ArgumentParser
中的参数,会引发错误。 - 只返回解析后的命名空间(包含所有已知参数的值)。
parser.parse_known_args()
- 解析命令行参数,并返回一个命名空间和一个未知参数列表。如果存在未定义在
ArgumentParser
中的参数,这些参数会被存储在返回的未知参数列表中,而不会引发错误。 -
parse_known_args()
方法返回一个包含两个元素的元组,第一个元素是解析后的命名空间(包含已知参数的值),第二个元素是未知参数列表。 -
parse_known_args()[0]
只返回解析后的命名空间(已知参数的值),忽略未知参数列表。
import argparse
# 创建 ArgumentParser 实例
parser = argparse.ArgumentParser("用来介绍parser!!")
# 添加命令行参数
#help用于在命令行中打印“--batch_size”的用法,可以提醒自己和其他使用此程序的人
parser.add_argument('--batch_size', type=int, default=64, help="定义batch")
parser.add_argument('--epoch', type=int, default=200, help="定义训练轮数")
parser.add_argument('--learning_rate', type=float, default=0.001, help="定义学习率")
# 解析命令行参数
args = parser.parse_args()
print(args)
# 解析命令行参数2
args_known = parser.parse_known_args()
print(args_known)
print(args_known[0])
print(args_known[1])
输出:
参考:【Python】【深度学习】使用argparse模块和JSON管理深度学习模型的超参数_深度学习代码中用的argparse是什么意思,能不能不用-****博客