1、介绍
如下,我们经常会看到很多类似下面这种loss突然下降很多的情况,这是由于学习率衰减的原因导致网络的性能更好,相比于cos衰减,这里的衰减是自己控制的
2、代码介绍
这里用到了两个参数,分别如下
milestones : 在哪几个epoch衰减
gamma : 衰减的倍率是多少
这里简单测试一下:
总共训练100伦,在epoch = 50和90的时候,lr每次衰减为之前的0.1
绘制的结果如下:
3、测试代码
如下:
import argparse
import torch
import matplotlib.pyplot as plt
import torch.nn as nn # 神经网络库
import torch.nn.functional as F # 函数功能库,如relu、sigmoid等等
class Net(nn.Module): # 继承父类
def __init__(self):
super(Net, self).__init__()
self.conv = nn.Conv2d(3, 6, 5)
self.fc = nn.Linear(6 * 5 * 5, 2)
def forward(self, x):
x = F.max_pool2d(F.relu(self.conv(x)), 2)
x = x.view(x.shape[0], -1)
x = self.fc(x)
return x
def main(args):
model = Net()
optimizer = torch.optim.SGD(model.parameters(), lr=args.lr)
scheduler = torch.optim.lr_scheduler.MultiStepLR(optimizer,milestones=args.lr_steps, gamma=args.lr_gamma)
lr_list =[]
for epoch in range(args.epochs):
# train one epoch
scheduler.step() # 更新学习率
# evaluate
lr = optimizer.param_groups[0]["lr"]
lr_list.append(lr) # 记录学习率数值
# 绘图
plt.figure(figsize=(12,8))
plt.plot(lr_list)
plt.show()
if __name__ == '__main__':
parser = argparse.ArgumentParser(description="test")
parser.add_argument('--epochs', default=100, type=int)
parser.add_argument('--lr', default=0.1, type=float)
parser.add_argument('--lr-steps', default=[50,90], nargs='+', type=int,help='decrease lr every step-size epochs')
parser.add_argument('--lr-gamma', default=0.1, type=float, help='decrease lr by a factor of lr-gamma')
args = parser.parse_args()
print(args)
main(args)