代码之家  ›  专栏  ›  技术社区  ›  dorien

PyTorch中的简单L1损失

  •  0
  • dorien  · 技术社区  · 5 年前

    我想计算神经网络中的L1损失,我在 https://discuss.pytorch.org/t/simple-l2-regularization/139/2 ,但这段代码中有一些错误。

    这真的是如何计算神经网络中的L1损失,还是有更简单的方法?

    l1_crit = nn.L1Loss()
    reg_loss = 0
    for param in model.parameters():
        reg_loss += l1_crit(param)
    
    factor = 0.0005
    loss += factor * reg_loss
    

    这在任何方面都等同于简单的做法吗:

    loss = torch.nn.L1Loss()
    

    我假设不是,因为我没有传递任何网络参数。只是检查是否存在执行此操作的现有功能。

    0 回复  |  直到 5 年前
        1
  •  1
  •   JVGD    5 年前

    如果我理解得很好,你想计算你的模型的L1损失(正如你在开始时所说)。然而,我认为你可能会对pytorch论坛上的讨论感到困惑。

    据我所知,在Pytorch论坛和你发布的代码中,作者正试图用L1正则化来规范网络权重。因此,它试图强制权重值落在合理的范围内(不太大,也不太小)。这是使用L1归一化的权重归一化(这就是为什么它使用 model.parameters() ). 归一化以一个值作为输入,并产生一个归一化值作为输出。 检查此项以进行权重归一化: https://pytorch.org/docs/master/generated/torch.nn.utils.weight_norm.html

    另一方面,L1损失只是确定2个值之间差异的一种方式,因此“损失”只是衡量这种差异的指标。在L1损失的情况下,该误差用平均绝对误差计算 loss = |x-y| 哪里 x y 是要比较的值。因此,误差计算将2个值作为输入,并产生一个值作为输出。 检查此项以计算损失: https://pytorch.org/docs/master/generated/torch.nn.L1Loss.html

    回答你的问题:不,上述代码段并不等价,因为第一个代码段试图进行权重归一化,而第二个代码段则试图计算损失。这将是在某种背景下的损失计算:

    sample, target = dataset[i]
    target_predicted = model(sample)
    loss = torch.nn.L1Loss()
    loss_value = loss(target, target_predicted)
    
    推荐文章