pytorch--训练分层学习率设置

Posted huxiaohu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了pytorch--训练分层学习率设置相关的知识,希望对你有一定的参考价值。

在训练模型时,我们经常会使用两个神经网络模型进行融合,若两个模型的复杂度不同,或者激活函数不同,导致训练后的模型训练损失忽高忽低,差距巨大,有可能是陷入了局部最优的状况。这时候采用分层学习率的策略可能帮助模型度过局部最优困境。

下面是一个简单的示例:

对于一个继承于nn.Module的神经网络模型Model

class Model(nn.Module):
	def __init__(self):
		super().__init__()
		self.layer1 = nn.Sequential(nn.Linear(20, 10), nn.Tanh())
		self.layer2 = nn.Linear(10, 1)
	
	def forward(self, x):
		out = self.layer1(x)
		out = self.layer2(out)
		return out

那么分层学习率的设置大致如下:

model = Model() # 模型初始化
# 设置分层学习率
params_list = [\'params\': model.layer1.parameters(), \'lr\': 0.001,
	\'params\': model.layer2.parameters(), \'lr\': 0.002]
# 将学习率传入优化器 
optimizeer = torch.optim.RMSprop(params_list)
# 模型训练
train(model, max_epoch, optimizer, train_iter, vali_iter, test_iter, loss_func)

如何在 Pytorch 中应用分层学习率?

【中文标题】如何在 Pytorch 中应用分层学习率?【英文标题】:How to apply layer-wise learning rate in Pytorch? 【发布时间】:2019-01-18 23:06:53 【问题描述】:

我知道可以冻结网络中的单个层,例如仅训练预训练模型的最后一层。我正在寻找一种将某些学习率应用于不同层的方法。

因此,例如,第一层的学习率非常低,为 0.000001,然后逐渐增加以下每一层的学习率。这样最后一层的学习率就会达到 0.01 左右。

这在 pytorch 中可行吗?知道如何存档吗?

【问题讨论】:

【参考方案1】:

解决办法如下:

from torch.optim import Adam

model = Net()

optim = Adam(
    [
        "params": model.fc.parameters(), "lr": 1e-3,
        "params": model.agroupoflayer.parameters(),
        "params": model.lastlayer.parameters(), "lr": 4e-2,
    ],
    lr=5e-4,
)

其他未在优化器中指定的参数将不会进行优化。因此,您应该说明所有层或组(或要优化的层)。如果您没有指定学习率,它将采用全局学习率(5e-4)。 诀窍是当您创建模型时,您应该为图层命名,或者您可以对其进行分组。

【讨论】:

太好了,正是我想要的——谢谢!

以上是关于pytorch--训练分层学习率设置的主要内容,如果未能解决你的问题,请参考以下文章

Pytorch 模型 查看网络参数的梯度以及参数更新是否正确,优化器学习率的分层设置

Pytorch不同层设置不同学习率

Pytorch不同层设置不同学习率

PyTorch - 如何在训练期间获得学习率?

如何在 Tensorflow 中设置分层学习率?

如何在 Tensorflow 中设置分层学习率?