记录一行行看代码baidu的知识点。
一、引用
sys.path.append(r'E:\桌面文件\代码\FRN-main\FRN-main\trainers') from eval import meta_test
- 引用 eval.py 文件中的 meta_test 函数。需要正确导入。
二、logging模块(输出运行日志)
formatter = logging.Formatter( "[%(asctime)s] %(message)s",datefmt='%m/%d %I:%M:%S') logger = logging.getLogger() logger.setLevel(logging.INFO)
- Formatter是一个格式化器:输出日志记录的布局/格式。
- %(asctime)s创建日志记录时的时间,形式:2024-1-22 13:50。
- %(asctime)s已经记录的消息。datefmt=' ' 时间。
- logger = logging.getLogger():实例化,创建一个logger日志对象。
- setLever():设置日志记录级别。
- logging.INFO输出日志的信息,程序正常运行产生的信息。
fh = logging.FileHandler(filename,"w") fh.setFormatter(formatter) logger.addHandler(fh)
- FileHandler():将日志信息输入到磁盘文件filename上。
- 比较:StreamHandler()能够将日志信息输出到sys.stdout, sys.stderr 或者类文件对象(更确切点,就是能够支持write()和flush()方法的对象)
- setFormatter():自定义日志格式
- addHandler():logger日志对象加载FileHandler对象
三、argparse模块
用来设置参数,是Python模块:命令行选项、参数和子命令解析器。
parser = argparse.ArgumentParser() parser.add_argument("--opt",help="optimizer",choices=['adam','sgd']) parser.add_argument("--stage",help="number lr stages",type=int,default=30) parser.add_argument("--gpu",help="gpu device",type=int,default=0)
1、创建解析器
- parser = argparse.ArgumentParser()
- 创建一个ArgumentParser对象
- ArgumentParser包含将命令行解析成Python数据类型所需的全部信息
2、添加参数
- parser.add_argument('--sum'......)
- 给一个ArgumentParser添加程序参数信息是通过调用add_argument()方法完成的。
3、解析参数
- parser.parse_args()
4、add_argument() 方法
- help: 一个此选项作用的简单描述
- type:命令行参数应当被转换成的类型
- defualt:当参数未在命令行中出现时使用的值
- choices:可用的参数的容器
- action:当参数在命令行中出现时使用的动作基本类型
- name or flags:一个命名或者一个选项字符串的列表,例如
foo
或-f, --foo
四、
optimizer和scheduler
optimizer = torch.optim.Adam(model.parameters(),lr=args.lr,weight_decay=args.weight_decay)
- model.parameters():模型的参数。
- lr:学习率,默认值是0.001,控制每次参数更新的步长。
- weight_decay:权重衰减,也称L2正则化项,默认值是0, 控制参数的幅度,防止过拟合。
optimizer = torch.optim.SGD(model.parameters(),lr=args.lr,momentum=0.9,weight_decay=args.weight_decay,nesterov=args.nesterov)
- SGD随机梯度下降
- momentum(动量):用过去梯度的moving average来更新参数,加快梯度下降的速度。
- nesterov:Momentum的变种。与Momentum唯一区别就是,计算梯度的不同。Nesterov动量中,先用当前的速度临时更新一遍参数,再用更新的临时参数计算梯度。
scheduler = optim.lr_scheduler.MultiStepLR(optimizer,milestones=args.decay_epoch,gamma=args.gamma)
- MultiStepLR:按需调整学习率。
- milestones:每个元素代表何时调整学习率。
- gamma:学习率调整倍数,默认为 0.1 倍,即下降 10 倍。
scheduler = optim.lr_scheduler.StepLR(optimizer,step_size=args.epoch,gamma=args.gamma)
- StepLR:等间隔调整学习率。
- step_size:学习率下降间隔数,若为 30,则会在 30、 60、 90…个 step 时,将学习率调整为 lr*gamma。
- last_epoch:上一个 epoch 数,这个变量用来指示学习率是否需要调整。当last_epoch 符合设定的间隔时,就会对学习率进行调整。当为-1 时,学习率设置为初始值。
五、seed
设置随机种子是为了确保每次生成固定的随机数,这就使得每次实验结果显示一致了,有利于实验的比较和改进。使得每次运行该 .py 文件时生成的随机数相同。
seed = args.seed torch.manual_seed(seed) torch.cuda.manual_seed(seed)
- torch.manual_seed(seed):为CPU设置种子,生成随机数。
- torch.cuda.manual_seed(seed):为特定GPU设置种子,生成随机数。
np.random.seed(seed) torch.cuda.set_device(args.gpu)
- np.random.seed(seed):生成指定随机数。
- cuda.set_device():把模型和数据加载到对应的GPU