【问题标题】:Modifying Torch criterion修改 Torch 标准
【发布时间】:2017-06-02 16:58:53
【问题描述】:

我想在 Torch 中创建一个自定义损失函数,这是对 ClassNLLCriterion 的修改。具体而言,ClassNLLCriterion loss 为:

loss(x, class) = -x[class]

我想修改为:

loss(x, class) = -x[class]*K

其中K 是网络输入的函数,而不是网络权重或网络输出的函数。因此K 可以被视为一个常量。

实现此自定义标准的最简单方法是什么? updateOutput() 函数看起来很简单,但是如何修改updateGradInput() 函数呢?

【问题讨论】:

    标签: torch loss


    【解决方案1】:

    基本上,您的损失函数L 是输入和目标的函数。所以你有

    loss(input, target) = ClassNLLCriterion(input, target) * K
    

    如果我理解正确你的新损失。然后你想实现updateGradInput,它返回你的损失函数相对于输入的导数,即

    updateGradInput[ClassNLLCriterion](input, target) * K + ClassNLLCriterion(input, target) * dK/dinput
    

    因此,您只需要根据损失函数的输入计算 K 的导数(您没有给我们计算 K 的公式)并将其代入上一行。由于您的新损失函数依赖于ClassNLLCriterion,您可以使用此损失函数的updateGradInputupdateOutput 来计算您的损失函数。

    【讨论】:

    • 所以基本上我不必编写自定义标准。在我的训练代码中,我可以简单地这样做:loss = ClassNLLCriterion:forward()*K 然后grad = ClassNLLCriterion:backward()*K+loss*(dK/dinput) 这是正确的吗?
    • 是的,这也是可能的
    • 太棒了。谢谢!另一个问题,如果 K 只是一个常数(不依赖于网络参数或输入或输出),那么在这种情况下你的答案会如何变化?
    • 如果 K 只是一个常数,我看不出使用它的意义......它只会将所有损失值乘以相同的常数。所以你可以简单地使用ClassNLLCriterion
    猜你喜欢
    • 1970-01-01
    • 2021-06-06
    • 1970-01-01
    • 1970-01-01
    • 2011-06-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-13
    相关资源
    最近更新 更多