Pytorch不同层的学习率设置,学习率的调节,对参数施加L2 Penalty
##1.Pytorch对于不同层设置不同的学习率1
2
3
4optim.SGD([
{'params': model.base.parameters()},
{'params': model.classifier.parameters(), 'lr': 1e-3}
], lr=1e-2, momentum=0.9)
model.base.parameters()
将使用1e-2的学习率,model.classifier.parameters()
将使用1e-3的学习率,- 0.9的momentum作用于所有的parameters。
##2.甚至可以对于同一层的weight和bias设置不同的lr1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22import torch
import torch.nn as nn
import torch.optim as optim
from torch.autograd import Variable
class Net(nn.Module):
def __init__(self):
super(Net, self).__init__()
self.layer = nn.Linear(1, 1)
def forward(self, x):
return self.layer(x)
if __name__=="__main__":
net = Net()
optimizer = optim.Adam([
{'params': net.layer.weight},
{'params': net.layer.bias, 'lr': 0.01}
], lr=0.1, weight_decay=0.0001)
out = net(Variable(torch.Tensor(1)))
out.backward()
optimizer.step()
##3.训练过程中学习率的调节torch.optim.lr_scheduler
中提供了多种方法,如
LambdaLR
StepLR
MultiStepLR
ExponentialLR
举个官网给的例子1
2
3
4
5
6
7
8
9>>> # Assuming optimizer uses lr = 0.05 for all groups
>>> # lr = 0.05 if epoch < 30
>>> # lr = 0.005 if 30 <= epoch < 80
>>> # lr = 0.0005 if epoch >= 80
>>> scheduler = MultiStepLR(optimizer, milestones=[30,80], gamma=0.1)
>>> for epoch in range(100):
>>> scheduler.step()
>>> train(...)
>>> validate(...)
##4.对参数加 L2 penalty
Pytorch中的Adam,RMSprop,SGD等都有一个weight_decay的参数,默认为0,如果设置不为0,对参数会实施L2 penalty。
optimizer = torch.optim.Adam(model.parameters(), lr=1e-4, weight_decay=1e-5)