import torch | |
import torch.optim as optim | |
def WarmupLR(optimizer, warmup_step=0, down_step=5e4, max_lr=1e-4, min_lr=1e-5, **kwargs): | |
alpha = (max_lr - 1e-5) / warmup_step**2 | |
def lr_lambda(step): | |
init_lr = 1e-5 | |
s1, s2 = warmup_step, warmup_step + down_step | |
if step < s1: | |
return init_lr + alpha * step**2 | |
elif s1 <= step < s2: | |
return (max_lr - min_lr) / (s1 - s2) * step + (min_lr*s1 - max_lr*s2) / (s1 - s2) | |
else: | |
return min_lr | |
return optim.lr_scheduler.LambdaLR(optimizer, lr_lambda) | |