Те же функции потери показали разные результаты обучения.
Я реализовал функцию взвешенной потери кости с керасом 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-го каналов.
Я полагаю, что эти функции потерь должны показывать аналогичную кривую обучения во время обучения.