【问题标题】:Loss of Multi-Output Model in PytorchPytorch 中多输出模型的丢失
【发布时间】:2019-11-12 19:50:24
【问题描述】:

当我使用相同的损失训练它们然后反向传播时,我在 PyTorch 中有一个多输出模型,我将两个输出的损失结合起来,但是当一个输出损失减少时,其他损失增加等等。我该如何解决这个问题?

def forward(self, x):
    #neural network arch. forward pass
    x = dense1(x)
    x1 = dense2(x)
    x2 = dense2(x)
    x1 = F.log_softmax(x1) 
    x2 = F.log_softmax(x2)
    return x1, x2

out1, out2 = model(data)
loss1 = NLLL(out1, target1)
loss2 = NLLL(out2, target2)
loss = loss1 + loss2
loss.backward()

当 loss1 减少 loss2 增加并且当 loss2 减少 loss1 增加时,我该如何解决这个问题。 是否可以使用除“+”之外的任何其他运算符来组合损失,或者我应该对不同的损失加权吗?

【问题讨论】:

  • 您为什么认为这不是合理的行为?尝试减小步长。
  • 我也试过了,但没有帮助。我在 keras 中制作了相同的模型,并且两者的损失同时减少。
  • 你能解释一下这里发生了什么吗?为什么要计算两次相同的输出并将其与不同的目标进行比较?
  • 我试图通过同一个神经网络预测价格和数量。这就是我使用来自先前层的 x 的原因,然后它传递给 log_softmax 函数。
  • 你确定你做的一切正确吗?您还需要使用optimizer.zero_grad()optimizer.step() 将梯度归零,但这里没有显示完整代码。所以请检查一下。

标签: machine-learning deep-learning pytorch


【解决方案1】:

如果你有两个不同的损失函数,并且你分别为它们完成了forwards,那么这样做很聪明

(loss1 + loss2).backward() 

这在计算上是高效的。

你应该实现的是让你的模型学习,如何最小化损失。 您的示例中的某些代码不存在,但您应该有 nn.Module,可能您的自定义模块中的参数应该学会降低到损失。

我喜欢你对loss = loss1 + loss2 求和的方法。

【讨论】:

  • (loss1+loss2).backward() 与 loss.backward() 有何不同
猜你喜欢
  • 2021-12-18
  • 1970-01-01
  • 2021-07-15
  • 1970-01-01
  • 2019-10-19
  • 2021-11-27
  • 2021-04-24
  • 2020-09-11
  • 1970-01-01
相关资源
最近更新 更多