Я пытаюсь реализовать пользовательскую функцию потерь для моей модели CNN. Я нашел ноутбук IPython , в котором реализована пользовательская функция потерь с именем Dice, а именно:
from keras import backend as K
smooth = 1.
def dice_coef(y_true, y_pred, smooth=1):
intersection = K.sum(y_true * y_pred, axis=[1,2,3])
union = K.sum(y_true, axis=[1,2,3]) + K.sum(y_pred, axis=[1,2,3])
return K.mean( (2. * intersection + smooth) / (union + smooth), axis=0)
def bce_dice(y_true, y_pred):
return binary_crossentropy(y_true, y_pred)-K.log(dice_coef(y_true, y_pred))
def true_positive_rate(y_true, y_pred):
return K.sum(K.flatten(y_true)*K.flatten(K.round(y_pred)))/K.sum(y_true)
seg_model.compile(optimizer = 'adam',
loss = bce_dice,
metrics = ['binary_accuracy', dice_coef, true_positive_rate])
Я никогда раньше не использовал keras backend и действительно путаюсь с матричными вычислениями keras backend. Итак, я создал несколько тензоров, чтобы увидеть, что происходит в коде:
val1 = np.arange(24).reshape((4, 6))
y_true = K.variable(value=val1)
val2 = np.arange(10,34).reshape((4, 6))
y_pred = K.variable(value=val2)
Теперь я запускаю функцию dice_coef
:
result = K.eval(dice_coef(y_true=y_true, y_pred=y_pred))
print('result is:', result)
Но это дает мне эту ошибку:
ValueError: Invalid reduction dimension 2 for input with 2 dimensions. for 'Sum_32' (op: 'Sum') with input shapes: [4,6], [3] and with computed input tensors: input[1] = <1 2 3>.
Затем я изменил все [1,2,3]
на -1
, как показано ниже:
def dice_coef(y_true, y_pred, smooth=1):
intersection = K.sum(y_true * y_pred, axis=-1)
# intersection = K.sum(y_true * y_pred, axis=[1,2,3])
# union = K.sum(y_true, axis=[1,2,3]) + K.sum(y_pred, axis=[1,2,3])
union = K.sum(y_true, axis=-1) + K.sum(y_pred, axis=-1)
return K.mean( (2. * intersection + smooth) / (union + smooth), axis=0)
Теперь это дает мне значение.
result is: 14.7911625
Вопросы:
- Что такое
[1,2,3]
?
- Почему код работает, когда я меняю
[1,2,3]
на -1
?
- Что делает эта
dice_coef
функция?