转载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)