向目标函数加入正则的具体实现

  2018-12-1 


  1. 在数据经过模型之后

    l1, l2 = torch.tensor(0), torch.tensor(0)
    optimizer.zero_grad()
    output = model(input)
    for params in model.parameters():
        l1 += torch.norm(param,1)  #torch.norm(param,1)为求param的l1范数
        l2 += torch.norm(param,2)  #torch.norm(param,2)为求param的l2范数
    loss_origin = loss(output,label)
    loss = loss_origin + l1 + l2
    loss.backward()
    optimizer.step()

    ATT:不能使用在模型中输出!

    使用以下这种方法是输出的中间层的输出,而不是参数!

    #错误示范
    class model(nn.Module):
        def __init__(self):
            super().__init__()
            self.linear1 = nn.Linear(64,32)
            self.linear2 = nn.Linear(32,16)
        def forward(self,input):
            linear1_out = self.linear1(input)
            linear2_out = self.linear2(linear1_out)
            return linear1_out,linear2_out
  2. 使用pytorch自带的权重衰减

    torch.optim自带的参数weight_decay可以设置权值衰减率,即可以实现L2正则化


且听风吟