如何解决如何在大的不平衡体积上设置多类软骰子损失函数的平滑度?
使用 V-Net paper 中建议的平滑骰子函数:
在 pytorch 中为多个类编码并添加了平滑,以便始终可整除:
class DiceLoss(torch.nn.Module):
def __init__(self,smooth=1):
super(DiceLoss,self).__init__()
self.smooth = smooth
def forward(self,inputs,targets):
assert inputs.shape == targets.shape,f"Shapes don't match {inputs.shape} != {targets.shape}"
inputs = inputs[:,1:] # skip background class
targets = targets[:,1:] # skip background class
axes = tuple(range(2,len(inputs.shape))) # sum over elements per sample and per class
intersection = torch.sum(inputs * targets,axes)
addition = torch.sum(torch.square(inputs) + torch.square(targets),axes)
return 1 - torch.mean((2 * intersection + self.smooth) / (addition + self.smooth))
目标是大小为 52^3 = 140.608 的体积样本块。样本与具有 97% 背景、2% 肝脏和 1% 肿瘤的体积不重叠。因此,大多数补丁将完全是背景。骰子损失在 0 和 1 之间。
假设一个补丁是完全背景(大多数情况下),并且所有元素的预测为 0.01 (=1%) 肝脏和 0.01 肿瘤。将平滑度设置为 1.0 仍然会导致
1 - (2 x 0 + 1) / (0 + 140.608 x 0.0001 + 1) = 0.9336
即使预测准确,也接近最大损失。
这迫使网络将肝脏或肿瘤的可能性降低到 0.001 或更低。骰子损失常用的平滑度设置是什么?
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。