参考链接:https://blog.csdn.net/qyhaill/article/details/103043637
https://zhuanlan.zhihu.com/p/352821601
https://blog.csdn.net/qq_37612828/article/details/108213578
import torch
import torch.nn as nn
from torch.optim.lr_scheduler import LambdaLR
initial_lr = 5
class model(nn.Module):
def __init__(self):
super().__init__()
self.conv1 = nn.Conv2d(in_channels=3, out_channels=3, kernel_size=3)
def forward(self, x):
pass
net_1 = model()
optimizer_1 = torch.optim.Adam(net_1.parameters(), lr = initial_lr)
scheduler_1 = LambdaLR(optimizer_1, lr_lambda=lambda epoch: 1/(epoch+1),verbose = True)
print("初始化的学习率:", optimizer_1.defaults['lr'])
for epoch in range(1, 11):
optimizer_1.zero_grad()
optimizer_1.step()
print("第%d个epoch的学习率:%f" % (epoch, optimizer_1.param_groups[0]['lr']))
scheduler_1.step()
结合不同调度器的方法:
初始学习率乘以系数,由于每一次乘系数都是乘初始学习率,因此系数往往是epoch的函数。
torch.optim.lr_scheduler.LambdaLR(optimizer, lr_lambda, last_epoch=- 1, verbose=False)
计算公式:
lr_lambda = f(epoch)
new_lr = lr_lambda * init_lr
lr_lambda: lambda epoch: 1 / (epoch + 1)如下图:
参数:
lambda1 = lambda epoch: 0.95 ** epoch
scheduler = LambdaLR(optimizer, lr_lambda=lambda1, verbose = True)
for epoch in range(100):
train(...)
validate(...)
scheduler.step()
与LambdaLR不同,该方法用前一次的学习率乘以lr_lambda,因此通常lr_lambda函数不需要与epoch有关。
torch.optim.lr_scheduler.MultiplicativeLR(optimizer, lr_lambda, last_epoch=- 1, verbose=False)
lr_lambda: lambda epoch: 0.9如下图: