【发布时间】: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