动态调整学习率

 

目录

1.使用官方scheduler

2.自定义scheduler


1.使用官方scheduler

  • lr_scheduler.LambdaLR
  • lr_scheduler.MultiplicativeLR
  • lr_scheduler.StepLR
  • lr_scheduler.MultiStepLR
  • lr_scheduler.ExponentialLR
  • lr_scheduler.CosineAnnealingLR
  • lr_scheduler.ReduceLROnPlateau
  • lr_scheduler.CyclicLR
  • lr_scheduler.OneCycleLR
  • lr_scheduler.CosineAnnealingWarmRestarts

 1.1 lr_scheduler.LambdaLR:

scheduler_1 = torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)

其中,更新学习率方式是 lr = lr*lr_lambda

lr_lambda可以是用户自定义的规则也可以是lambda表达式:

·lambda表达式: lr_lambda = lambda epoch:0.1

·用户自定义规则:

                             def rule(epoch):

                             lamda = math.pow(0.5, int(epoch / 3))

                             return lamda

1.2 lr_scheduler.MultiplicativeLR:

torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=-1, verbose=False)

1.3 lr_scheduler.StepLR:

scheduler_2 = torch.optim.lr_scheduler.StepLR(optimizer, step_size, gamma, last_epoch=-1)

其中,step_size(int):每训练step_size个epoch,更新一次参数

gamma(float):更新lr的乘法因子

last_epoch (int):最后一个epoch的index

1.4 lr_scheduler.MultiStepLR:

torchscheduler_3 = torch.optim.lr_scheduler.MultiStepLR(optimizer, milestones, gamma=0.1, last_epoch=-1)

其中,milestones:为一个数组,比如设为[20,30]。如果初始学习率设为0.1,当在第20epoch时为0.01,第30epoch时为0.001。

1.5 lr_scheduler.ExponentialLR:

scheduler = lr_scheduler.ExponentialLR(optimizer, gamma)

按gamma的次方的方法调整。

1.6 lr_scheduler.CosineAnnealingLR:

torch.optim.lr_scheduler.CosineAnnealingLR(optimizer, T_max, eta_min=0, last_epoch=- 1, verbose=False)

其中,参数T-max:指的是cosine 函数 经过多少次更新完成四分之一个周期

1.7 lr_scheduler.ReduceLROnPlateau:

torch.optim.lr_scheduler.ReduceLROnPlateau(optimizer, mode=‘min’, factor=0.1, patience=10, verbose=False, threshold=0.0001, threshold_mode=‘rel’, cooldown=0, min_lr=0, eps=1e-08)

1.8 lr_scheduler.CyclicLR:

torch.optim.lr_scheduler.CyclicLR(optimizer, base_lr, max_lr, step_size_up=500, step_size_down=500, mode='triangular', gamma=1.0, scale_fn=None, scale_mode='cycle', cycle_momentum=True, base_momentum=0.8, max_momentum=0.9, last_epoch=-1)

 1.9 lr_scheduler.OneCycleLR:

torch.optim.lr_scheduler.OneCycleLR(optimizer, max_lr, total_steps=None, epochs=None, steps_per_epoch=None, pct_start=0.3, anneal_strategy='cos', cycle_momentum=True, base_momentum=0.85, max_momentum=0.95, div_factor=25.0, final_div_factor=10000.0, three_phase=False, last_epoch=- 1, verbose=False)

其中,

  • optimizer(Optimizer) -包装优化器。

  • max_lr(float或者list) -每个参数组在循环中的上层学习率边界。

  • total_steps(int) -循环中的总步数。请注意,如果此处未提供值,则必须通过提供 epochs 和 steps_per_epoch 的值来推断。默认值:无

  • epochs(int) -要训练的 epoch 数。如果未提供 total_steps 的值,则将其与 steps_per_epoch 一起使用以推断循环中的总步数。默认值:无

  • steps_per_epoch(int) -每个时期要训练的步数。如果未提供 total_steps 的值,则将其与 epochs 一起使用以推断循环中的总步数。默认值:无

  • pct_start(float) -用于提高学习率的周期百分比(以步数计)。默认值:0.3

  • anneal_strategy(str) -{‘cos’, ‘linear’} 指定退火策略:“cos” 用于余弦退火,“linear” 用于线性退火。默认值:‘cos’

  • cycle_momentum(bool) -如果 True ,动量与 ‘base_momentum’ 和 ‘max_momentum’ 之间的学习率成反比循环。默认值:真

  • base_momentum(float或者list) -每个参数组的循环中较低的动量边界。请注意,动量循环与学习率成反比;在一个周期的峰值,动量是‘base_momentum’,学习率是‘max_lr’。默认值:0.85

  • max_momentum(float或者list) -每个参数组在循环中的上动量边界。从函数上讲,它定义了周期幅度 (max_momentum - base_momentum)。请注意,动量循环与学习率成反比;在循环开始时,动量为‘max_momentum’,学习率为‘base_lr’ 默认值:0.95

  • div_factor(float) -通过 initial_lr = max_lr/div_factor 确定初始学习率 默认值:25

  • final_div_factor(float) -通过 min_lr = initial_lr/final_div_factor 确定最小学习率 默认值:1e4

  • three_phase(bool) -如果True,使用调度的第三阶段根据‘final_div_factor’来消灭学习率,而不是修改第二阶段(前两个阶段将关于‘pct_start’指示的步骤对称)。

  • last_epoch(int) -最后一批的索引。恢复训练作业时使用此参数。自从step()应该在每批之后调用,而不是在每个 epoch 之后调用,这个数字代表总数量批次计算的,而不是计算的 epoch 总数。当last_epoch=-1 时,调度从头开始。默认值:-1

  • verbose(bool) -如果 True ,每次更新都会向标准输出打印一条消息。默认值:False

实际应用时可以简单表示为:

scheduler =torch.optim.lr_scheduler.OneCycleLR(optimizer,max_lr=0.9,total_steps=100, verbose=True)

其中,max-lr:每个参数组在循环中的上层学习率边界

           total_steps: 总的batch数

 1.10 lr_scheduler.CosineAnnealingWarmRestarts:

torch.optim.lr_scheduler.CosineAnnealingWarmRestarts(optimizer, T_0, T_mult=1, eta_min=0, last_epoch=- 1, verbose=False)

其中,T_0 (int) :学习率第一次回到初始值的epoch位置

           T_mult (int, optional):T_mult=2意思是周期翻倍,第一个周期是1,则第二个周期是2,第三个周期是4。

           eta_min (float, optional) – Minimum learning rate. Default: 0

2.自定义scheduler

首先定义动态变化函数:adjust_learning_rate

 def adjust_learning_rate(optimizer, epoch):
     lr = optimizer.param_groups[0]['lr']  # 学习率每个epoch乘以0.1
     lr = lr * (0.1 ** (epoch // 10)) #学习率没10个epoch乘以0.1
     return lr

在应用时,在优化函数之后:

optimizer.zero_grad()
loss.backward()
optimizer.step()
adjust_learning_rate(optimizer, epoch)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
学习率是训练深度学习模型中一个重要的超参数,对模型的训练效果有极大的影响。PyTorch中提供了多种动态调整学习率的方法,能够根据训练过程中的损失值、准确率或训练轮数等信息动态调整学习率,从而使得训练过程更加有效和高效。 在PyTorch中,可以通过定义一个学习率调度器(lr_scheduler)来实现动态调整学习率。PyTorch中提供了以下几种学习率调整器: 1. StepLR(lr_scheduler.StepLR):在给定的一个step_size的间隔内,将学习率乘以gamma。当epoch_size被调整为n时,学习率按下面的公式来更新: ```python lr = lr * gamma ^ floor(epoch_size / step_size) ``` 这个调度器通常使用一个固定的step_size,每n个epoch就将学习率缩小一定比例。 2. MultiStepLR(lr_scheduler.MultiStepLR):在给定milestones列表中的epoch数后,将学习率乘以gamma。每个milestone后,gamma的乘数乘以上一个。 ```python if epoch in milestones: lr = lr * gamma ``` 这个调度器通常使用一个milestones列表,在每个milestone处将学习率乘以gamma。 3. ExponentialLR(lr_scheduler.ExponentialLR):获取指数衰减值gamma,然后每个epoch更新学习率。公式为 ```python lr = lr * gamma ** epoch ``` 该调度器通常将学习率按指数级衰减,gamma通常是在0.1-0.9之间,通常选择比较小的值。 4. CosineAnnealingLR(lr_scheduler.CosineAnnealingLR):将学习率按照一定的余弦函数来调整。公式为 ```python lr = eta_min + 0.5 * (lr_max - eta_min) * (1 + cos(T_cur / T_max * pi)) ``` 其中T_cur是当前epoch的个数,T_max是期望学习率到达点的epoch数量。 如果调度器以指定的warmup_epochs开始,那么lr_max将被限制到第warmup_epochs个epoch的学习率。 以上是PyTorch中几种常见的学习率调整方式,每种方式都有其优缺点。根据具体的模型和数据集,选择合适的学习率调整方式可以使得训练过程更加有效和高效。同时,也可以将不同的学习率调整方式进行组合,实现更加复杂的学习率调整策略。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值