Deep learning PyTorch中的参数特定学习率

Deep learning PyTorch中的参数特定学习率,deep-learning,pytorch,gradient-descent,Deep Learning,Pytorch,Gradient Descent,如何为网络中的每个特定参数(权重和偏差)设置学习率 我发现了这个: optim.SGD([{'params':model.base.parameters()}, {'params':model.classifier.parameters(),'lr':1e-3}], lr=1e-2,动量=0.9) 其中定义一组参数的model.classifier.parameters(),可获得1e-3的特定学习率 但是如何将其转换为参数级别?您可以通过使用参数名称设置学习率来设置参数特定的学习率,例如 对

如何为网络中的每个特定参数(权重和偏差)设置学习率

我发现了这个:

optim.SGD([{'params':model.base.parameters()},
{'params':model.classifier.parameters(),'lr':1e-3}],
lr=1e-2,动量=0.9)
其中定义一组参数的
model.classifier.parameters()
,可获得1e-3的特定学习率


但是如何将其转换为参数级别?

您可以通过使用参数名称设置学习率来设置参数特定的学习率,例如

对于从以下位置获取的给定网络:

类网络(nn.Module):
定义初始化(自):
超级(网络,自我)。\uuuu初始化
self.layer1=nn.Linear(1,1)
自.层1.重量.数据.填充(1)
self.layer1.bias.data.fill(1)
self.layer2=nn.Linear(1,1)
自.层2.重量.数据.填充(1)
self.layer2.bias.data.fill(1)
def前进(自身,x):
x=自身。第1层(x)
返回自我。第2层(x)
net=net()
对于名称,net.named_parameters()中的参数为:
印刷品(名称)
参数包括:

layer1.weight
第1层:偏见
第二层重量
第二层。偏见
然后,您可以使用参数名称设置其特定学习率,如下所示:

optimizer=optim.Adam([
{'params':net.layer1.weight},
{'params':net.layer1.bias,'lr':0.01},
{'params':net.layer2.weight,'lr':0.001}
],lr=0.1,重量(衰减=0.0001)
out=净(火炬张量([[1]]))
out.backward()
optimizer.step()
打印(“weight”,net.layer1.weight.data.numpy(),“grad”,net.layer1.weight.grad.data.numpy())
打印(“bias”,net.layer1.bias.data.numpy(),“grad”,net.layer1.bias.grad.data.numpy())
打印(“weight”,net.layer2.weight.data.numpy(),“grad”,net.layer2.weight.grad.data.numpy())
打印(“bias”,net.layer2.bias.data.numpy(),“grad”,net.layer2.bias.grad.data.numpy())
输出:

重量[[0.9]]梯度[[1.0001]]
偏差[0.99]梯度[1.0001]
重量[[0.999]]梯度[[2.0001]]
偏差[1.]梯度[1]

谢谢您的回答。甚至可以访问conv专门过滤权重吗?您也可以对conv层使用对应于每个层的
.weight
.bias
(其名称可以像我一样通过循环
.parameters()
获得)。我的意思是访问内核中的每个参数:
{params]:model.conv.weight[0,0,0,0],“lr”:0.1}
。不幸的是,这给了我一个错误:
ValueError:无法优化非叶张量
我不确定在这种情况下是否可以这样做。我将检查是否可能。我可能已经找到了一种方法。有必要创建一个新的优化器,并将
torch.optim.Adam
步骤
方法中的最后一行更改为:p.data.add((-step\u size*(exp\u avg.type(torch.double)/denom.type(torch.double))).type(torch.float32))