相同的损失函数显示出不同的训练结果。
我使用keras 2.2.2实现了3D分割的加权骰子丢失功能。
def create_dice_coef(smooth=1, axis=[1, 2], weights=[1, 1]):
def dice_coef(y_true, y_pred, smooth=1):
intersection = K.sum(K.abs(y_true * y_pred), axis=axis) # size=(batch, channel)
denom = K.sum(y_true + y_pred, axis=axis) # size=(batch, channel)
return K.mean(weights*(2. * intersection[:, 1:] + smooth) / (denom[:, 1:] + smooth))
return dice_coef
def create_loss_dice_coef(smooth=1, axis=[1, 2], weights=[1, 1]):
def loss_dice_coef(y_true, y_pred):
dice_coef = create_dice_coef(smooth=smooth, axis=axis, weights=weights)
return 1.0 - dice_coef(y_true, y_pred)
return loss_dice_coef
loss = create_loss_dice_coef(axis=[1, 2, 3], weights=[1, 1])
如果将return K.mean(weights*(2. * intersection[:, 1:] + smooth) / (denom[:, 1:] + smooth))
替换为return K.mean((2. * intersection[:, 1:] + smooth) / (denom[:, 1:] + smooth))
(只是删除了weights
),则结果会明显不同。
(我用轴= [1、2、3]和权重= [1、1]训练了3D unet)
由于权重= [1,1],因此我假设return K.mean(weights*(2. * intersection[:, 1:] + smooth) / (denom[:, 1:] + smooth))
和return K.mean((2. * intersection[:, 1:] + smooth) / (denom[:, 1:] + smooth))
应该相同。我用一些数据测试了这些功能,并返回了相同的值(来自K.get_value())
我想念什么吗?乘以K和列表不起作用?
在没有weights
争论的情况下,训练期间的损失减少了,但是在weights
下,训练期间的损失没有减少。
注意:在损耗函数中,仅计算第二和第三通道的损耗。
我希望这些损失函数在训练过程中会显示出相似的学习曲线。