pytorch optim灵活传参

有时候训练模型肯定是需要optim对吧,但是很多情况下,我一个模型,有encoder,有dense等等不同层构成的,而每一层、每一种模型我都想要用不同的学习率,该怎么办?

torch.optim就给我们提供了一个很好的接口,先看看doc:
在这里插入图片描述
比方说这是Adam的参数要求,后面这些lr、beta、weight_decay啥的先不去看他,就先看params这个参数:
params:iterable of parameters to optimize or dicts defining parameter groups
需要被优化的可迭代模型参数对象或者一个定义了所有parameter groups的dict

也就是params不仅可以传model.parameters(),还可以传一个字典,这就可以让我们很灵活地设置参数了,比方说像这样:

params = []
for name, param in self._encoder.named_parameters():
    if param.requires_grad == True:
        if "weight" in name:
            params += [{"params": param, "lr": self._learning_rate, "weight_decay": self._weight_decay}]
        elif "bias" in name:
            params += [{"params": param, "lr": self._learning_rate}]
params += [{"params": list(dense_layer.parameters())[0], "lr": self._learning_rate * 10,
            "weight_decay": self._weight_decay}]
params += [{"params": list(dense_layer.parameters())[1], "lr": self._learning_rate * 10}]
# each task has it's own optimizer
optimizer = Adam(params)

可以看到我设置所有weight有weight_decay,而bias的为0。同时,我的dense层lr是encoder层的10倍。然后把这个dict,也就是parameter groups传给了Adam.

或者再pythonic点吧,和上面的写法一样的效果:

named_params = {name:param for name,param in self.named_parameters() if param.requires_grad == True}
no_decay = ['bias', 'LayerNorm.bias', 'LayerNorm.weight']
params = []
params += [{"params":[p for n,p in named_params.items() if not any([nd in n for nd in no_decay])],"weight_decay":0.01}]
params += [{"params":[p for n, p in named_params.items() if any(nd in n for nd in no_decay)],"weight_decay":0.0}]

optimizer = Adam(params)
  • 3
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
05-30
PyTorch是一个基于Python的科学计算库,它支持GPU加速,是一个开源的深度学习框架。它主要提供了两个高级功能:Tensor计算和深度神经网络。PyTorch广泛应用于各种机器学习任务,如自然语言处理、计算机视觉、自动驾驶等领域。 以下是一个简单的PyTorch代码示例,演示了如何使用PyTorch来创建一个线性回归模型: ```python import torch import torch.nn as nn import numpy as np import matplotlib.pyplot as plt # 生成一些数据 x = np.random.rand(100, 1) * 5 y = 2 * x + 1 + np.random.randn(100, 1) # 将数据转换为PyTorch张量 x_tensor = torch.from_numpy(x).float() y_tensor = torch.from_numpy(y).float() # 定义线性回归模型 class LinearRegression(nn.Module): def __init__(self, input_size, output_size): super(LinearRegression, self).__init__() self.linear = nn.Linear(input_size, output_size) def forward(self, x): out = self.linear(x) return out # 初始化模型参数 input_size = 1 output_size = 1 learning_rate = 0.01 num_epochs = 1000 model = LinearRegression(input_size, output_size) # 定义损失函数和优化器 criterion = nn.MSELoss() optimizer = torch.optim.SGD(model.parameters(), lr=learning_rate) # 训练模型 for epoch in range(num_epochs): # 前向传播 outputs = model(x_tensor) loss = criterion(outputs, y_tensor) # 反向传播和优化 optimizer.zero_grad() loss.backward() optimizer.step() if (epoch+1) % 100 == 0: print('Epoch [{}/{}], Loss: {:.4f}'.format(epoch+1, num_epochs, loss.item())) # 绘制结果 predicted = model(x_tensor).detach().numpy() plt.plot(x, y, 'ro', label='Original data') plt.plot(x, predicted, label='Fitted line') plt.legend() plt.show() ``` 这个例子中,我们生成了一些随机数据,并使用PyTorch来创建一个简单的线性回归模型。我们定义了模型、损失函数和优化器,并使用随机梯度下降算法来训练模型。最后,我们使用matplotlib库来绘制结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值