Lovasz Softmax loss for Image Segmentation问题的直观解释

数据挖掘 深度学习 图像分类 损失函数
2022-02-15 03:13:44

如今,Lovasz Softmax 被大量用于分割问题,而原始论文在解释它的工作原理方面真的很糟糕。

1个回答

Lovász-Softmax 损失:用于优化神经网络中的交集比联合度量的易于处理的代理。

损失可以自行优化,但最佳优化超参数(学习率、动量)可能与交叉熵的最佳超参数不同。正如论文中所讨论的,优化数据集-mIoU(Pascal VOC 度量)取决于批量大小和类数。因此,通过首先使用交叉熵进行优化并使用我们的损失进行微调,或者将这两种损失结合起来,您可能会获得最佳结果。

这是Lovasz Softmax Loss 在 Pytorch 和 Tensorflow 中的实现。

一步一步解释代码的重要步骤:

第 1 步:计算预测的误差:

signs = 2. * labels.float() - 1.
errors = (1. - logits * Variable(signs))
errors_sorted, perm = torch.sort(errors, dim=0, descending=True)

“错误”向量在预测为假时为正,在预测正确时为负。这里没什么特别的。请注意,此处使用的边距为 (1),这意味着那些边距低于 1 的正确预测被视为错误。

第 2 步: Lovasz 扩展 wrt 排序错误

gts = gt_sorted.sum()
ntersection = gts - gt_sorted.float().cumsum(0)
union = gts + (1 - gt_sorted).float().cumsum(0)
jaccard = 1. - intersection / union

此时,向量“jaccard”包含 Jaccard 索引相对于排序错误的演变。它在 0 和预测的实际 Jaccard 指数之间变化。

第 3 步: Lovasz 扩展 wrt 排序错误的梯度

代码的下一步包括计算这个向量的梯度。它由后向差分计算:

jaccard[1:p] = jaccard[1:p] - jaccard[0:-1]

这个向量说明了错误对 Jaccard 指数演变的影响。这个想法是最小化对 Jaccard 指数造成最大影响的错误。

第 4 步:计算损失

在代码的最后一步,实际损失计算为误差向量和 Lovasz 扩展梯度之间的点积。使用 Relu 是因为只有误差向量的正部分包含预测误差。

loss = torch.dot(F.relu(errors_sorted), Variable(grad))

更多信息