PloyLR策略是自定义的学习率调整策略,计算方式如下:
有如下优点:
- 1.更好的泛化能力:Poly学习率调整策略可以在训练后期逐渐降低学习率,避免过拟合,提高模型的泛化能力。
- 2.对超参数不敏感:Poly学习率调整策略的性能不太受超参数的影响,相对比较稳定。
- 3.计算量较小:Poly学习率调整策略的计算量相对较小,不会影响训练速度。
缺点包括:
- 1.收敛速度较慢:Poly学习率调整策略在训练初期学习率较低,收敛速度较慢。
- 2.不适用于所有模型:Poly学习率调整策略可能不适用于所有类型的模型,需要根据具体情况进行选择。
from torch.optim.lr_scheduler import _LRScheduler, StepLR
class PolyLR(_LRScheduler):
def __init__(self, optimizer, max_iters, power=0.9, last_epoch=-1, min_lr=1e-6):
self.power = power
self.max_iters = max_iters # avoid zero lr
self.min_lr = min_lr
super(PolyLR, self).__init__(optimizer, last_epoch)
def get_lr(self):
return [ max( base_lr * ( 1 - self.last_epoch/self.max_iters )**self.power, self.min_lr)
for base_lr in self.base_lrs]
【例子】
LR = 0.1
iteration = 50
max_epoch = 1000
weights = torch.randn((1), requires_grad=True)
target = torch.zeros((1))
optimizer = SGD([weights], lr=LR, momentum=0.9)
# flag = 0
flag = 1
if flag:
scheduler_lr = PolyLR(optimizer, 1000, power=0.9)
lr_list, epoch_list = list(), list()
for epoch in range(max_epoch):
lr_list.append(scheduler_lr.get_lr())
epoch_list.append(epoch)
for i in range(iteration):
loss = torch.pow((weights - target), 2)
loss.backward()
optimizer.step()
optimizer.zero_grad()
scheduler_lr.step()
plt.plot(epoch_list, lr_list, label="Poly LR Scheduler")
plt.xlabel("Epoch")
plt.ylabel("Learning rate")
plt.legend()
plt.show()