l1、l2正则化在pytorch框架下的实现方式

转载PyTorch训练模型添加L1/L2正则化的两种实现方式_hlld__的博客-CSDN博客_pytorch添加正则化

在使用PyTorch训练模型时,可使用三种方式添加L1/L2正则化:一种是添加正则化项到损失函数中,另一种是在backward()之后,添加正则化项到参数变量的梯度中,然后再进行step(),一种是torch.optim优化器实现L2正则化

方式一:添加到损失函数

def l1_regularization(model, l1_alpha):
    l1_loss = []
    for module in model.modules():
        if type(module) is nn.BatchNorm2d:
            l1_loss.append(torch.abs(module.weight).sum())
    return l1_alpha * sum(l1_loss)

def l2_regularization(model, l2_alpha):
    l2_loss = []
    for module in model.modules():
        if type(module) is nn.Conv2d:
            l2_loss.append((module.weight ** 2).sum() / 2.0)
    return l2_alpha * sum(l2_loss)

方式二:添加到参数梯度

backward()之后,添加正则化项到参数变量的梯度中,然后再进行step()。这种方式可以指定哪一层使用正则化。

loss=criterion(outputs,labels)
loss.backward()#反向传播求梯度
l1/l2正则化方法
optimizer.step()#更新参数
def l1_regularization(model, l1_alpha):
    for module in model.modules():
        if type(module) is nn.BatchNorm2d:
            module.weight.grad.data.add_(l1_alpha * torch.sign(module.weight.data))

def l2_regularization(model, l2_alpha):
    for module in model.modules():
        if type(module) is nn.Conv2d:
            module.weight.grad.data.add_(l2_alpha * module.weight.data)

方式三:torch.optim优化器实现L2正则化

torch.optim集成了很多优化器,如SGD,Adadelta,Adam,Adagrad,RMSprop等,这些优化器自带的一个参数weight_decay,用于指定权值衰减率,相当于L2正则化中的λ参数,注意torch.optim集成的优化器只有L2正则化方法,weight_decay默认0.

optimizer = optim.Adam(model.parameters,lr=learning_rate,weight_decay=0.01)

你可能感兴趣的:(pytorch,pytorch,正则化)