【问题标题】:How to implement differentiable hamming loss in pytorch?如何在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

也许有一些相似但不同的损失函数?

【问题讨论】:

    标签: python pytorch loss-function hamming-distance differentiation


    【解决方案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 您能否举例说明建议解决方案(离散预测的转换)和应用交叉熵损失的工作代码?谢谢
    猜你喜欢
    • 2020-02-04
    • 2020-08-06
    • 1970-01-01
    • 2021-03-29
    • 2019-12-27
    • 1970-01-01
    • 2019-05-28
    • 1970-01-01
    • 2019-07-07
    相关资源
    最近更新 更多