我刚刚在Keras中实现了广义Dice损失(Dice损失的多类版本),如ref所述:
(我的目标定义为:(batch_size,image_dim1,image_dim2,image_dim3,nb_of_classes))
但是一定有什么问题。我正在处理必须分割为4类(1个背景类和3个物体类,我有一个不平衡的数据集)的3D图像。第一个奇怪的事情:虽然我的训练损失和准确度在训练过程中得到了改善(并且收敛非常快),但我的验证损失/准确度在整个时期内都保持不变(见image)。其次,在对测试数据进行预测时,只有背景类被预测:我得到一个恒定的体积。
(我的目标定义为:(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
但是一定有什么问题。我正在处理必须分割为4类(1个背景类和3个物体类,我有一个不平衡的数据集)的3D图像。第一个奇怪的事情:虽然我的训练损失和准确度在训练过程中得到了改善(并且收敛非常快),但我的验证损失/准确度在整个时期内都保持不变(见image)。其次,在对测试数据进行预测时,只有背景类被预测:我得到一个恒定的体积。
我使用完全相同的数据和脚本,但使用分类交叉熵损失得到合理的结果(物体类被分割)。这意味着我的实现有问题。有什么想法吗?
此外,我认为为keras社区提供通用的dice损失实现将是有用的,因为它似乎在大多数最新的语义分割任务中都被使用(至少在医学图像社区中是如此)。
附言:我觉得权重的定义很奇怪;我得到的值大约在10^-10左右。还有其他人尝试过实现这个吗?我也测试了没有权重的函数,但仍然出现相同的问题。