【问题标题】:How to ignore loss only some of the time in PyTorch如何在 PyTorch 中仅在某些时候忽略损失
【发布时间】:2020-10-29 14:41:30
【问题描述】:

在 PyTorch 中训练神经网络时,我希望能够查看模型输出并决定特定输出是应该导致损失还是被忽略(=零损失)。

通常的训练循环如下所示:

for (data, labels) in loader:
    data, labels = data.to(device), labels.to(device)
    optimizer.zero_grad()
    logits = model(data)
    loss = criterion(logits, labels)
    loss.backward()
    optimizer.step()

将部分损失归零的最佳方法是什么?

在计算标准之前我应该​​让一些标签等于 logits 吗?

或者,我可以在调用 loss.backward() 之前计算损失后修改损失吗? (以及如何?我可以将它乘以一个 0 和 1 的掩码,或者将它往返到一个 numpy 数组并对其进行修改,等等)

这里的用例是语义分割,某种。标签是粗略的图像,其中每个区域(对应于输入图像中的 32x32 补丁)可以是“是”、“否”或“模糊”。无论网络输出是什么,“模棱两可”的都不应产生损失。在这种情况下,我从标签中知道哪些损失应该被忽略;但我也想知道如何根据输出和标签来忽略。

【问题讨论】:

  • 如果这是您想要的,即模型不更新,则使损失为零不会使梯度为零。如果您希望模型在某些情况下不更新,那么您可以为其设置一个 if 条件并将optimizer.step() 放在条件内。
  • @akshayk07 谢谢,这很有帮助;我认为这不会像将损失设置为零那么简单。我需要小批量的某些部分 - 或标签的某些部分 - 对渐变没有贡献;不要完全跳过该小批量的更新。

标签: neural-network pytorch conv-neural-network


【解决方案1】:

在训练网络时,如果验证损失减少,您可以保存最佳模型。 试试这个代码:

if valid_loss <= valid_loss_min:
        print('Validation loss decreased ({:.6f} --> {:.6f}).  Saving model ...'.format(valid_loss_min, valid_loss))
        torch.save(model.state_dict(), 'model_name.pt')
        valid_loss_min = valid_loss

【讨论】:

  • 谢谢,这不是我要找的。我需要禁用/归零由损失的某些部分产生的梯度,而不是保存最佳模型。
猜你喜欢
  • 2012-11-08
  • 2019-04-26
  • 2020-01-01
  • 2012-02-11
  • 2015-10-04
  • 2013-08-10
  • 1970-01-01
  • 2017-05-25
  • 1970-01-01
相关资源
最近更新 更多