Spaces:
Sleeping
Sleeping
from torch.optim.lr_scheduler import _LRScheduler | |
class ConstantLR(_LRScheduler): | |
def __init__(self, optimizer, last_epoch=-1): | |
super(ConstantLR, self).__init__(optimizer, last_epoch) | |
def get_lr(self): | |
return [base_lr for base_lr in self.base_lrs] | |
class PolynomialLR(_LRScheduler): | |
def __init__(self, optimizer, max_iter, power=0.9, last_epoch=-1): | |
self.max_iter = max_iter | |
self.power = power | |
super(PolynomialLR, self).__init__(optimizer, last_epoch) | |
def get_lr(self): | |
factor = (1 - self.last_epoch / float(self.max_iter)) ** self.power | |
return [base_lr * factor for base_lr in self.base_lrs] | |
class WarmUpLR(_LRScheduler): | |
def __init__( | |
self, optimizer, scheduler, mode="linear", warmup_iters=100, gamma=0.2, last_epoch=-1 | |
): | |
self.mode = mode | |
self.scheduler = scheduler | |
self.warmup_iters = warmup_iters | |
self.gamma = gamma | |
super(WarmUpLR, self).__init__(optimizer, last_epoch) | |
def get_lr(self): | |
cold_lrs = self.scheduler.get_lr() | |
if self.last_epoch < self.warmup_iters: | |
if self.mode == "linear": | |
alpha = self.last_epoch / float(self.warmup_iters) | |
factor = self.gamma * (1 - alpha) + alpha | |
elif self.mode == "constant": | |
factor = self.gamma | |
else: | |
raise KeyError("WarmUp type {} not implemented".format(self.mode)) | |
return [factor * base_lr for base_lr in cold_lrs] | |
return cold_lrs | |
if __name__ == '__main__': | |
import torch | |
from torchvision.models import resnet18 | |
max_iter = 600 * 125 | |
model = resnet18() | |
op = torch.optim.SGD(model.parameters(),0.001) | |
sc = PolynomialLR(op,max_iter) | |
lr = [] | |
for i in range(max_iter): | |
sc.step() | |
print(i,sc.last_epoch,sc.get_lr()[0]) | |
lr.append(sc.get_lr()[0]) | |
from matplotlib import pyplot as plt | |
plt.plot(list(range(max_iter)),lr) | |
plt.show() |