最近研究网络代码的时候,发现师姐的网络在优化的时候学习率是不完全相同的,如下面所示,于是想搞明白。
我平常设置学习率都是整个网络统一设置,
optimizer = torch.optim.SGD(net.parameters(), lr=0.5)
optimizer = optim.SGD([
# encoder-weights
{'params': net.get_parameter_left_weights(net), 'lr': lr * 0.5},
# encoder-bias
{'params': net.get_parameter_left_bias(net, bias=True), 'lr': lr * 0.5},
# decoder-weights
{'params': net.get_parameter_right_weights(net), 'lr': lr},
# decoder-bias
{'params': net.get_parameter_right_bias(net, bias=True), 'lr': lr*2}
], lr=lr, momentum=0.9, weight_decay=0.0005)
首先设置一个简单的网络便于测试
class module(nn.Module):
def __init__(self):
super(module, self).__init__()
self.features = nn.Conv2d(in_channels=3, out_channels=64, stride=1, kernel_size=3, padding=1)
self.classifiter = nn.Conv2d(in_channels=64, out_channels=128, stride=1, kernel_size=3, padding=1)
def forward(self, x):
relu =nn.ReLU()
x = self.features(x)
x = self.classifiter(x)
return relu(x)
我们可以分层设置,学习率,按照下面的格式
lr = 1
optimizer = torch.optim.SGD([{'params': net.features.weight, 'lr': lr * 0.5},
{'params': net.features.bias, 'lr': lr * 0.3},
{'params': net.classifiter.weight},
{'params': net.classifiter.bias}], lr=1e-5)
# print(net.features.weight)
# print(net.classifiter.weight)
print(optimizer)
SGD (
Parameter Group 0
dampening: 0
lr: 0.5
momentum: 0
nesterov: False
weight_decay: 0
Parameter Group 1
dampening: 0
lr: 0.3
momentum: 0
nesterov: False
weight_decay: 0
Parameter Group 2
dampening: 0
lr: 1e-05
momentum: 0
nesterov: False
weight_decay: 0
Parameter Group 3
dampening: 0
lr: 1e-05
momentum: 0
nesterov: False
weight_decay: 0
)
打印后看到结果,在关于features的字典中,我们注明了学习率,学习率就会按我们制定的;而在classifiter中没有注明学习率,学习率就会按后面默认的的。