【问题标题】:If I have multiple losses that I sum together, do I have to declare separate loss functions?如果我将多个损失加在一起,是否必须声明单独的损失函数?
【发布时间】:2021-06-27 09:54:29
【问题描述】:

我正在尝试训练一个使用多重损失的模型。我注意到在某些实现中,单个损失函数被声明为 loss_fct = nn.LossFunction() 并多次用于计算单独的损失,这些损失被求和并反向传播。例如:

loss_fct = nn.LossFunction()

loss1 = loss_fct(pred1, labels1)
loss2 = loss_fct(pred2, labels2)

total_loss = loss1 + loss2
total_loss.backward()
optimizer.step()

这样可以吗,还是我应该为每个损失声明单独的损失函数对象?如果这没问题,为什么没问题?这对我来说似乎违反直觉,因为它们是我们根据不同目的优化的单独损失。一次求和和反向传播有点道理,但我无法使用单个损失对象来解决问题。

【问题讨论】:

  • 不确定我是否理解这个问题,但这比nn.LossFunction()(pred1, labels1) 更简洁
  • 我想我在阅读评论后可能会有更好的想法。我最初认为损失函数本身就是我们正在优化的东西,但将其简单地视为一个函数是否正确?所以只要我们提供不同的输入,我们是否重用同一个对象并不重要?
  • 没错。 Python 函数可以像其他任何东西一样保存为变量,并且(理想情况下)是无状态的,因此使用来自它们的不同输入就可以了。
  • 特别是损失函数是具有自定义__call__ 方法的类。它们以这种方式实现(而不仅仅是一个普通函数),因为它们可以通过各种方式进行参数化。

标签: python pytorch


【解决方案1】:

您必须创建某个损失函数的实例的原因是,某些损失函数具有影响其计算方式的可选参数。

例如MSELoss支持不同的缩减模式。

如果您在每个输出上计算相同的损失函数(损失函数本身具有相同的参数化),则无需实例化损失函数的多个实例。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-04
    • 2019-11-01
    • 1970-01-01
    • 2019-01-15
    • 1970-01-01
    相关资源
    最近更新 更多