训练中动态调整学习率lr,optimizer.param_groups

四、在训练中动态的调整学习率

 

1

2

3

4

5

6

7

8

9

'''调整学习率'''

# 新建optimizer或者修改optimizer.params_groups对应的学习率

# # 新建optimizer更简单也更推荐,optimizer十分轻量级,所以开销很小

# # 但是新的优化器会初始化动量等状态信息,这对于使用动量的优化器(momentum参数的sgd)可能会造成收敛中的震荡

# ## optimizer.param_groups:长度2的list,optimizer.param_groups[0]:长度6的字典

print(optimizer.param_groups[0]['lr'])

old_lr = 0.1

optimizer = optim.SGD([{'params': net.features.parameters()},

                       {'params': net.classifiter.parameters(), 'lr': old_lr*0.1}], lr=1e-5)

 可以看到optimizer.param_groups结构,[{'params','lr', 'momentum', 'dampening', 'weight_decay', 'nesterov'},{……}],集合了优化器的各项参数。

 

--------------------------------------------------------------------

动态修改学习率
for param_group in optimizer.param_groups:
    param_group["lr"] = lr 


得到学习率   optimizer.param_groups[0]["lr"] 

我自己查看的优化器参数

# print('查看optimizer.param_groups结构:')
# i_list=[i for i in optimizer.param_groups[0].keys()]
# print(i_list)    
['amsgrad', 'params', 'lr', 'betas', 'weight_decay', 'eps']

 

参考链接:

https://www.cnblogs.com/hellcat/p/8496727.html

https://www.pytorchtutorial.com/pytorch-learning-rate-decay/   

  • 24
    点赞
  • 95
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
代码解释并给每行代码添加注释:class CosineAnnealingWarmbootingLR: def __init__(self, optimizer, epochs=0, eta_min=0.05, steps=[], step_scale=0.8, lf=None, batchs=0, warmup_epoch=0, epoch_scale=1.0): self.warmup_iters = batchs * warmup_epoch self.optimizer = optimizer self.eta_min = eta_min self.iters = -1 self.iters_batch = -1 self.base_lr = [group['lr'] for group in optimizer.param_groups] self.step_scale = step_scale steps.sort() self.steps = [warmup_epoch] + [i for i in steps if (i < epochs and i > warmup_epoch)] + [epochs] self.gap = 0 self.last_epoch = 0 self.lf = lf self.epoch_scale = epoch_scale for group in optimizer.param_groups: group.setdefault('initial_lr', group['lr']) def step(self, external_iter = None): self.iters += 1 if external_iter is not None: self.iters = external_iter iters = self.iters + self.last_epoch scale = 1.0 for i in range(len(self.steps)-1): if (iters <= self.steps[i+1]): self.gap = self.steps[i+1] - self.steps[i] iters = iters - self.steps[i] if i != len(self.steps)-2: self.gap += self.epoch_scale break scale *= self.step_scale if self.lf is None: for group, lr in zip(self.optimizer.param_groups, self.base_lr): group['lr'] = scale * lr * ((((1 + math.cos(iters * math.pi / self.gap)) / 2) ** 1.0) * (1.0 - self.eta_min) + self.eta_min) else: for group, lr in zip(self.optimizer.param_groups, self.base_lr): group['lr'] = scale * lr * self.lf(iters, self.gap) return self.optimizer.param_groups[0]['lr'] def step_batch(self): self.iters_batch += 1 if self.iters_batch < self.warmup_iters: rate = self.iters_batch / self.warmup_iters for group, lr in zip(self.optimizer.param_groups, self.base_lr): group['lr'] = lr * rate return self.optimizer.param_groups[0]['lr'] else: return None
03-24
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值