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
的步骤
方法中的最后一行更改为: