如何在pytorch中实现可微的汉明损失?
Posted
技术标签:
【中文标题】如何在pytorch中实现可微的汉明损失?【英文标题】:How to implement differentiable hamming loss in pytorch? 【发布时间】:2020-06-21 06:32:49 【问题描述】:如何实现计算错误预测次数的可微损失函数?
output = [1,0,4,10]
target = [1,2,4,15]
loss = np.count_nonzero(output != target) / len(output) # [0,1,0,1] -> 2 / 4 -> 0.5
我已经尝试了一些实现,但它们是不可区分的。 RuntimeError: element 0 of tensors does not require grad and does not have a grad_fn
def hamming_loss(output, target):
#loss = torch.tensor(torch.nonzero(output != target).size(0)).double() / target.size(0)
#loss = torch.sum((output != target), dim=0).double() / target.size(0)
loss = torch.mean((output != target).double())
return loss
也许有一些相似但不同的损失函数?
【问题讨论】:
【参考方案1】:为什么不将离散预测(例如,[1, 0, 4, 10]
)转换为“软”预测,即每个标签的概率(例如,output
变成 4x(num 个标签) 概率向量)。
一旦有了“软”预测,就可以计算预测的输出概率和所需目标之间的交叉熵损失。
【讨论】:
谢谢,它有效。我的最后一层:nn.Linear(128, Number_Of_Classes *Size_Of_Predictions)。然后 x.view(x.size(0), Number_Of_Classes, Size_Of_Predictions) + CrossEntropyLoss 嗨,@Shai 你能用一些工作代码澄清解决方案吗?我不明白这个想法是如何包括汉明损失的,因为那是最初的想法。谢谢 @mark 我的想法不包括汉明损失。实际上,您不能将 Hamming 损失用作使用随机梯度下降 (SGD) 优化模型权重的标准:Hamming 损失的梯度几乎在所有地方都为零。因此,您必须使用“代理损失”,例如交叉熵。 @Shai。谢谢你。我明白。如果我们确实需要实施某种距离度量作为损失函数/惩罚/至少作为交叉熵损失之前损失函数的一部分,您有什么建议吗?汉明将是最简单的例子。谢谢 @Shai 您能否举例说明建议解决方案(离散预测的转换)和应用交叉熵损失的工作代码?谢谢以上是关于如何在pytorch中实现可微的汉明损失?的主要内容,如果未能解决你的问题,请参考以下文章
可微分的「OpenCV」:基于PyTorch的可微计算机视觉库