2017-06-02 58 views
0

我想在Torch中创建一个自定义丢失函数,这是对ClassNLLCriterion的修改。具体而言,ClassNLLCriterion损耗是:修改火炬标准

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

我想修改这是:

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

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

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

回答

1

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

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

如果我正确理解你的新损失。那么要实现updateGradInput这对于返回你的损失函数的导数的输入,这是

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

因此,你只需要计算ķWRT的衍生损失函数的输入(你没有给我们计算K)的公式并将其插入前一行。由于您的新损失函数依赖于ClassNLLCriterion,因此您可以使用此损失函数的updateGradInputupdateOutput来计算您的损失函数。

+0

所以基本上我不必编写自定义标准。在我的训练码中,我可以简单地做: 'loss = ClassNLLCriterion:forward()* K'然后 'grad = ClassNLLCriterion:backward()* K + loss *(dK/dinput)' 这是正确的吗? – braindead

+0

是的,这也是可能的 – fonfonx

+0

太棒了。谢谢!还有一个问题,如果K只是一个常量(不依赖于网络参数或输入或输出),那么在这种情况下你的答案会如何变化? – braindead