如何在PyTorch中为权重添加L1或L2正则化

在TensorFlow中,我们可以在顺序模型中添加L1或L2正则化。我在PyTorch中找不到类似的方法。如何在网络定义中为PyTorch中的权重添加正则化:

class Net(torch.nn.Module):    def __init__(self, n_feature, n_hidden, n_output):        super(Net, self).__init__()        self.hidden = torch.nn.Linear(n_feature, n_hidden)   # 隐藏层        """ 如何在某个隐藏层之后添加L1正则化?? """        """ 或者如何在某个隐藏层之后添加L2正则化?? """        self.predict = torch.nn.Linear(n_hidden, n_output)   # 输出层    def forward(self, x):        x = F.relu(self.hidden(x))      # 隐藏层的激活函数        x = self.predict(x)             # 线性输出        return xnet = Net(n_feature=1, n_hidden=10, n_output=1)     # 定义网络# print(net)  # 网络架构optimizer = torch.optim.SGD(net.parameters(), lr=0.2)loss_func = torch.nn.MSELoss()  # 这是用于回归的均方误差损失

回答:

一般来说,PyTorch通过优化器的weight_decay参数来处理L2正则化(您也可以为不同层分配不同的参数)。然而,这种机制不允许在不扩展现有优化器或编写自定义优化器的情况下进行L1正则化。

根据TensorFlow文档,他们对L1正则化使用reduce_sum(abs(x))惩罚,对L2正则化使用reduce_sum(square(x))惩罚。实现这一目标的最简单方法可能是直接将这些惩罚项添加到用于训练期间梯度计算的损失函数中。

# 将l1_weight和l2_weight设置为非零值以启用惩罚# 在训练循环中(给定输入x和目标y)...pred = net(x)loss = loss_func(pred, y)# 仅为net.hidden参数计算惩罚l1_penalty = l1_weight * sum([p.abs().sum() for p in net.hidden.parameters()])l2_penalty = l2_weight * sum([(p**2).sum() for p in net.hidden.parameters()])loss_with_penalty = loss + l1_penalty + l2_penaltyoptimizer.zero_grad()loss_with_penalty.backward()optimizer.step()# 我们最终关心的是惩罚前的损失print('loss:', loss.item())

Related Posts

使用LSTM在Python中预测未来值

这段代码可以预测指定股票的当前日期之前的值,但不能预测…

如何在gensim的word2vec模型中查找双词组的相似性

我有一个word2vec模型,假设我使用的是googl…

dask_xgboost.predict 可以工作但无法显示 – 数据必须是一维的

我试图使用 XGBoost 创建模型。 看起来我成功地…

ML Tuning – Cross Validation in Spark

我在https://spark.apache.org/…

如何在React JS中使用fetch从REST API获取预测

我正在开发一个应用程序,其中Flask REST AP…

如何分析ML.NET中多类分类预测得分数组?

我在ML.NET中创建了一个多类分类项目。该项目可以对…

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注