相同的损失函数在训练中显示出不同的结果

时间:2019-06-13 19:26:15

标签: python keras deep-learning tensor loss-function

相同的损失函数显示出不同的训练结果。

我使用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下,训练期间的损失没有减少。

注意:在损耗函数中,仅计算第二和第三通道的损耗。

我希望这些损失函数在训练过程中会显示出相似的学习曲线。

0 个答案:

没有答案