Python 骰子损失太低,但预测和标签之间没有重叠

Python 骰子损失太低,但预测和标签之间没有重叠,python,tensorflow,keras,dice,loss,Python,Tensorflow,Keras,Dice,Loss,我试图用我在这里找到的Unet在MRI图像的横截面积上实现骨骼的分割。标签是一个二进制png图像,我打算将其与我的预测进行比较。对于帧,我为我的DICOM MRI文件编写了自己的数据加载器 我在keras中使用以下骰子损失 def DiceLoss(targets, inputs, smooth=1e-6): #flatten label and prediction tensors inputs = K.flatten(inputs) targets = K.flatten(targets)

我试图用我在这里找到的Unet在MRI图像的横截面积上实现骨骼的分割。标签是一个二进制png图像,我打算将其与我的预测进行比较。对于帧,我为我的DICOM MRI文件编写了自己的数据加载器

我在keras中使用以下骰子损失

def DiceLoss(targets, inputs, smooth=1e-6):

#flatten label and prediction tensors
inputs = K.flatten(inputs)
targets = K.flatten(targets)

intersection = K.sum(K.dot(targets, inputs))
dice = (2*intersection + smooth) / (K.sum(targets) + K.sum(inputs) + smooth)
return 1 - dice
我在卡格尔见过 在我发现的Keras中的其他类似实现中

但是骰子损失总是太小(10^-4),即使预测和标签之间没有重叠。为什么会这样?我应该首先将预测转换为二进制掩码吗?如果是这样,我如何在keras做到这一点?我试图通过执行targets.numpy()将
targets
转换为numpy数组,然后应用一个阈值,但它抛出了一个“tensor没有属性numpy”错误。你还有别的想法吗


谢谢

很难说清楚你的问题在哪里,因为可能有很多不同的来源。我考虑的一件事是,根据过去处理生物医学数据的经验,阶级不平衡是一个巨大的问题。如果存在类不平衡,您的模型很可能会学习到一个简单的次优解决方案。尝试使用成批均匀分布的班级进行训练是的,班级不平衡,骨骼只是一个小点。这就是为什么我尝试使用骰子损失来看看它是否更好,如果我的预测和标签之间没有交叉点,骰子损失不应该是1吗?很难确切地说出你的问题在哪里,因为可能有很多不同的来源。我考虑的一件事是,根据过去处理生物医学数据的经验,阶级不平衡是一个巨大的问题。如果存在类不平衡,您的模型很可能会学习到一个简单的次优解决方案。尝试使用成批均匀分布的班级进行训练是的,班级不平衡,骨骼只是一个小点。这就是为什么我试着用骰子损失来看看它是否更好,如果我的预测和标签之间没有交集,骰子损失不应该是1吗?