123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227 |
- import math
- from functools import partial
- import numpy as np
- from torch.optim import lr_scheduler
- class StepLR(object):
- def __init__(self,
- step_each_epoch,
- step_size,
- warmup_epoch=0,
- gamma=0.1,
- last_epoch=-1,
- **kwargs):
- super(StepLR, self).__init__()
- self.step_size = step_each_epoch * step_size
- self.gamma = gamma
- self.last_epoch = last_epoch
- self.warmup_epoch = warmup_epoch
- def __call__(self, optimizer):
- return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
- self.last_epoch)
- def lambda_func(self, current_step):
- if current_step < self.warmup_epoch:
- return float(current_step) / float(max(1, self.warmup_epoch))
- return self.gamma**(current_step // self.step_size)
- class MultiStepLR(object):
- def __init__(self,
- step_each_epoch,
- milestones,
- warmup_epoch=0,
- gamma=0.1,
- last_epoch=-1,
- **kwargs):
- super(MultiStepLR, self).__init__()
- self.milestones = [step_each_epoch * e for e in milestones]
- self.gamma = gamma
- self.last_epoch = last_epoch
- self.warmup_epoch = warmup_epoch
- def __call__(self, optimizer):
- return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
- self.last_epoch)
- def lambda_func(self, current_step):
- if current_step < self.warmup_epoch:
- return float(current_step) / float(max(1, self.warmup_epoch))
- return self.gamma**len(
- [m for m in self.milestones if m <= current_step])
- class ConstLR(object):
- def __init__(self,
- step_each_epoch,
- warmup_epoch=0,
- last_epoch=-1,
- **kwargs):
- super(ConstLR, self).__init__()
- self.last_epoch = last_epoch
- self.warmup_epoch = warmup_epoch * step_each_epoch
- def __call__(self, optimizer):
- return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
- self.last_epoch)
- def lambda_func(self, current_step):
- if current_step < self.warmup_epoch:
- return float(current_step) / float(max(1.0, self.warmup_epoch))
- return 1.0
- class LinearLR(object):
- def __init__(self,
- epochs,
- step_each_epoch,
- warmup_epoch=0,
- last_epoch=-1,
- **kwargs):
- super(LinearLR, self).__init__()
- self.epochs = epochs * step_each_epoch
- self.last_epoch = last_epoch
- self.warmup_epoch = warmup_epoch * step_each_epoch
- def __call__(self, optimizer):
- return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
- self.last_epoch)
- def lambda_func(self, current_step):
- if current_step < self.warmup_epoch:
- return float(current_step) / float(max(1, self.warmup_epoch))
- return max(
- 0.0,
- float(self.epochs - current_step) /
- float(max(1, self.epochs - self.warmup_epoch)),
- )
- class CosineAnnealingLR(object):
- def __init__(self,
- epochs,
- step_each_epoch,
- warmup_epoch=0,
- last_epoch=-1,
- **kwargs):
- super(CosineAnnealingLR, self).__init__()
- self.epochs = epochs * step_each_epoch
- self.last_epoch = last_epoch
- self.warmup_epoch = warmup_epoch * step_each_epoch
- def __call__(self, optimizer):
- return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
- self.last_epoch)
- def lambda_func(self, current_step, num_cycles=0.5):
- if current_step < self.warmup_epoch:
- return float(current_step) / float(max(1, self.warmup_epoch))
- progress = float(current_step - self.warmup_epoch) / float(
- max(1, self.epochs - self.warmup_epoch))
- return max(
- 0.0, 0.5 *
- (1.0 + math.cos(math.pi * float(num_cycles) * 2.0 * progress)))
- class OneCycleLR(object):
- def __init__(self,
- epochs,
- step_each_epoch,
- last_epoch=-1,
- lr=0.00148,
- warmup_epoch=1.0,
- cycle_momentum=True,
- **kwargs):
- super(OneCycleLR, self).__init__()
- self.epochs = epochs
- self.last_epoch = last_epoch
- self.step_each_epoch = step_each_epoch
- self.lr = lr
- self.pct_start = warmup_epoch / epochs
- self.cycle_momentum = cycle_momentum
- def __call__(self, optimizer):
- return lr_scheduler.OneCycleLR(
- optimizer,
- max_lr=self.lr,
- total_steps=self.epochs * self.step_each_epoch,
- pct_start=self.pct_start,
- cycle_momentum=self.cycle_momentum,
- )
- class PolynomialLR(object):
- def __init__(self,
- step_each_epoch,
- epochs,
- lr_end=1e-7,
- power=1.0,
- warmup_epoch=0,
- last_epoch=-1,
- **kwargs):
- super(PolynomialLR, self).__init__()
- self.lr_end = lr_end
- self.power = power
- self.epochs = epochs * step_each_epoch
- self.warmup_epoch = warmup_epoch * step_each_epoch
- self.last_epoch = last_epoch
- def __call__(self, optimizer):
- lr_lambda = partial(
- self.lambda_func,
- lr_init=optimizer.defaults['lr'],
- )
- return lr_scheduler.LambdaLR(optimizer, lr_lambda, self.last_epoch)
- def lambda_func(self, current_step, lr_init):
- if current_step < self.warmup_epoch:
- return float(current_step) / float(max(1, self.warmup_epoch))
- elif current_step > self.epochs:
- return self.lr_end / lr_init # as LambdaLR multiplies by lr_init
- else:
- lr_range = lr_init - self.lr_end
- decay_steps = self.epochs - self.warmup_epoch
- pct_remaining = 1 - (current_step -
- self.warmup_epoch) / decay_steps
- decay = lr_range * pct_remaining**self.power + self.lr_end
- return decay / lr_init # as LambdaLR multiplies by lr_init
- class CdistNetLR(object):
- def __init__(self,
- step_each_epoch,
- lr=0.0442,
- n_warmup_steps=10000,
- step2_epoch=7,
- last_epoch=-1,
- **kwargs):
- super(CdistNetLR, self).__init__()
- self.last_epoch = last_epoch
- self.step2_epoch = step2_epoch * step_each_epoch
- self.n_current_steps = 0
- self.n_warmup_steps = n_warmup_steps
- self.init_lr = lr
- self.step2_lr = 0.00001
- def __call__(self, optimizer):
- return lr_scheduler.LambdaLR(optimizer, self.lambda_func,
- self.last_epoch)
- def lambda_func(self, current_step):
- if current_step < self.step2_epoch:
- return np.min([
- np.power(current_step, -0.5),
- np.power(self.n_warmup_steps, -1.5) * current_step,
- ])
- return self.step2_lr / self.init_lr
|