pytorch技巧总结1:学习率调整方法

pytorch技巧总结1:学习率调整方法

前言

​ 这个系列,我会把一些我觉得有用、有趣的关于pytorch的小技巧进行总结,希望可以帮助到有需要的朋友。

免责申明

​ 本人水平有限,若有误写、漏写,请大家温柔的批评指正。

目录结构

1. 用处

​ 学习率的调整在深度学习中是很重要的一块。而身为一个初学者,肯定会进行一些经典架构的代码复现,因此必定会涉及到如何实现论文中所说的“学习率调整”(一般通常是训练到一定程度,学习率除以10)

​ 因此,本篇文章就是简单的总结一些我目前见过的学习率调整方法。

2. 通过epoch次数和优化器来调节

2.1 思路来源

​ 首先介绍的第一个方法,是比较常用的方法,即通过epoch的次数和优化器来调节。

​ 主要流程为:

1. 开始训练
2. 当训练到指定epoch时,调整学习率
3. 继续训练

​ 其中的优化器指的就是我们所认知的“Adam、SGD”等优化器。

​ 这里主要利用的是这些优化器有一个参数名为param_groups,打印该参数值如下:

print(optim_G.param_groups)

​ 打印的值如下:

[{
    
    'params': [Parameter containing:......(这些是具体的参数值)], 'lr': 0.002, 'betas': (0.5, 0.999), 'eps': 1e-08, 'weight_decay': 0, 'amsgrad': False, 'maximize': False, 'foreach': None, 'capturable': False, 'differentiable': False, 'fused': False}]

​ 可以从上面看出,这是一个列表,里面包含了一个字典,这个字典里面有我们需要的学习率参数,即上面的lr

​ 因此,我们需要获取它,然后改变它,即可完成学习率的调整。

2.2 调整案例

​ 根据上面的想法,我下面给出调整学习率的一个模板,大家使用的时候按照这个模板即可:

......
# 开始训练
for e in range(epoch):
	# 50 这些数字根据自己的需求修改即可
	if e+1 == 50:  # 如果训练到第50个批次,那么可以调整学习率
        # 调整学习率
        # 首先,获取列表中第一个字典,然后获取学习率参数
        # 最后,将这个学习率除以10(或者改为你需要的学习率即可)
		optim.param_groups[0]['lr'] /= 10 
	.....  # 具体的训练代码

3. pytorch提供的方法

​ 上面的思路是我们根据优化器参数来实现的,而pytroch官方肯定是知道学习率调整的重要性的,因此他们也提供了方便快捷实现学习率调整的方法。

3.1 方法介绍

​ 方法名字和位置:

torch.optim.lr_scheduler.MultiStepLR

​ 该方法的重要参数介绍:

参数名字 意义
optimizer 优化器对象
milestones 一个数组,比如[50,80,100],表示第50、80、100批次的时候会自动调整学习率
gamma 指定倍率,比如0.1,表示后面调整学习率的时候自动乘以0.1(即除以10)

​ 其实,这个方法的调整思路和我们上面第一个方法是一样的,不过,这里实现更加方便。

3.2 调整案例

​ 同样的,下面我给出一个该方法的使用模板,大家根据需求修改即可:

....
optim = .... # 定义优化器‘
# 创建学习率调整器
scheduler = torch.optim.lr_scheduler.MultiStepLR(optim,milestones=[50,75,100],gamma=0.1)
# 开始训练
for e in range(epoch):
    .... # 正常的训练过程
    # 只是需要记住的是,一般在epoch训练完成后,在最后加上学习率更新的代码
    scheduler.step()
    ....

值得一提的是,pytorch提供的调整学习函数不只MultiStepLR,还有一些其它的,不过用法都类似,如果大家有需求,可以看看官方源码的介绍你即可

4. 保存参数后再次训练

4.1 思路

​ 这个方法不是很实用,这是我在最开始学习的的时候,对于pytorch的方法不熟悉的时候使用的思路。

​ 即,先指定训练一定的epoch,然后保存模型参数,接着修改模型学习率参数,然后加载刚刚训练完的参数,继续训练。

​ 这个方法的好处就是:当你在训练过程中,发现训练的不好或者哪里有问题,可以直接停止模型的训练,因为你上次训练的参数已经保存了,所以可以大胆的停止训练。

4.2 调整案例

​ 同样给出一个简单的模板:

.....
lr = 0.01
.....
for e in range(epoch):
	.... # 正常训练
# 训练完毕后,保存模型参数
torch.save(model.state_dict(),path)

# 下次训练
# 1. 修改学习率
lr = 0.001
# 2. 加载上次的模型参数
model.load_state_dict(torch.load(path))
# 3. 接着训练
......

5. 总结

​ 上面三种方法,常用的是第二种。当然,偶尔也是用用第一种和第三种。

​ 如果后面我遇到新的调整学习率方法,会及时更新该篇文章的。

猜你喜欢

转载自blog.csdn.net/weixin_46676835/article/details/131360319
今日推荐