Одна и та же функция потерь показала разные результаты в тренировках - PullRequest
0 голосов
/ 13 июня 2019

Те же функции потери показали разные результаты обучения.

Я реализовал функцию взвешенной потери кости с керасом 2.2.2 для 3D-сегментации unet.

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), результаты существенно отличаются.(Я обучил 3D Unet с осью = [1, 2, 3] и весами = [1, 1]) Поскольку веса = [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 и list не работают?

без аргумента weights, потеря была уменьшена во время обучения, но с weights, потеря не была уменьшена во время обучения.

Примечание:в функции потерь будут вычислены потери только 2-го и 3-го каналов.

Я полагаю, что эти функции потерь должны показывать аналогичную кривую обучения во время обучения.

...