我刚刚在keras中实现了广义骰子丢失(骰子丢失的多级版本),如ref中所述:

(我的目标定义为:(batch_size,image_dim1,image_dim2,image_dim3,nb_of_classes))

def generalized_dice_loss_w(y_true, y_pred): 
    # Compute weights: "the contribution of each label is corrected by the inverse of its volume"
    Ncl = y_pred.shape[-1]
    w = np.zeros((Ncl,))
    for l in range(0,Ncl): w[l] = np.sum( np.asarray(y_true[:,:,:,:,l]==1,np.int8) )
    w = 1/(w**2+0.00001)

    # Compute gen dice coef:
    numerator = y_true*y_pred
    numerator = w*K.sum(numerator,(0,1,2,3))
    numerator = K.sum(numerator)

    denominator = y_true+y_pred
    denominator = w*K.sum(denominator,(0,1,2,3))
    denominator = K.sum(denominator)

    gen_dice_coef = numerator/denominator

    return 1-2*gen_dice_coef

但事情肯定是错的 . 我正在使用3D图像,我必须分为4个类(1个背景类和3个对象类,我有一个不 balancer 的数据集) . 第一个奇怪的事情:虽然我的训练中的火车损失和准确性得到了提高(并且收敛速度非常快),但我的验证损失/准确性是不变的时期(见image) . 其次,在预测测试数据时,只预测背景类:我得到一个恒定的音量 .

我使用完全相同的数据和脚本但具有分类交叉熵损失并得到合理的结果(对象类被分段) . 这意味着我的实施出了问题 . 知道它可能是什么?

另外我相信对于keras社区来说,有一个广义的骰子丢失实现是有用的,因为它似乎在大多数最近的语义分割任务中使用(至少在医学图像社区中) .

PS:我觉得如何定义权重似乎很奇怪;我得到大约10 ^ -10的值 . 还有其他人试图实现这个吗?我也测试了我的功能没有重量,但同样的问题 .