在Pytorch中,如何将L1正则化函数添加到激活中?

(这里是火炬初学者)

我想将L1正则化器添加到ReLU的激活输出中。更一般而言,如何仅将正则化器添加到网络中的特定层?

这篇文章可能与以下内容有关: 在PyTorch中添加L1 /L2正则化? 但是,要么不相关,要么我不明白答案:

它指的是在优化中应用的L2正则化器,这是另一回事。换句话说,如果总的期望损失是

crossentropy + lambda1*L1(layer1) + lambda2*L1(layer2) + ...

我相信提供给torch.optim.Adagrad的参数仅适用于交叉熵损失。或将其应用于网络中的所有参数(权重)。但是无论如何,似乎不允许对单个激活层应用正则化器,并且不提供L1损失。

另一个相关主题是nn.modules.loss,其中包括L1Loss()。从文档中,我还不了解如何使用它。

最后,有一个模块https://github.com/pytorch/pytorch/blob/master/torch/legacy/nn/L1Penalty.py,它似乎最接近目标,但被称为“传统”。这是为什么?

回答:

这是您的操作方式:

  • 在模块的正向返回最终输出和要应用L1正则化的图层的输出中
  • loss 变量将是输出wrt目标的交叉熵损失与L1惩罚的总和。

这是一个示例代码

import torch

from torch.autograd import Variable

from torch.nn import functional as F

class MLP(torch.nn.Module):

def __init__(self):

super(MLP, self).__init__()

self.linear1 = torch.nn.Linear(128, 32)

self.linear2 = torch.nn.Linear(32, 16)

self.linear3 = torch.nn.Linear(16, 2)

def forward(self, x):

layer1_out = F.relu(self.linear1(x))

layer2_out = F.relu(self.linear2(layer1_out))

out = self.linear3(layer2_out)

return out, layer1_out, layer2_out

batchsize = 4

lambda1, lambda2 = 0.5, 0.01

model = MLP()

optimizer = torch.optim.SGD(model.parameters(), lr=1e-4)

# usually following code is looped over all batches

# but let's just do a dummy batch for brevity

inputs = Variable(torch.rand(batchsize, 128))

targets = Variable(torch.ones(batchsize).long())

optimizer.zero_grad()

outputs, layer1_out, layer2_out = model(inputs)

cross_entropy_loss = F.cross_entropy(outputs, targets)

all_linear1_params = torch.cat([x.view(-1) for x in model.linear1.parameters()])

all_linear2_params = torch.cat([x.view(-1) for x in model.linear2.parameters()])

l1_regularization = lambda1 * torch.norm(all_linear1_params, 1)

l2_regularization = lambda2 * torch.norm(all_linear2_params, 2)

loss = cross_entropy_loss + l1_regularization + l2_regularization

loss.backward()

optimizer.step()

以上是 在Pytorch中,如何将L1正则化函数添加到激活中? 的全部内容, 来源链接: utcz.com/qa/421035.html

回到顶部