如何在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中实现可微的汉明损失?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 keras 模型中实现汉明损失作为自定义指标

PyTorch自动求导:反向传播的一切

可微分的「OpenCV」:基于PyTorch的可微计算机视觉库

如何在 RealmRecyclerViewAdapter 中实现可过滤

如何在 Flutter 中实现可扩展面板?

如何在 Flutter 中实现可滚动的画布?