Неправильный результат проигрыша из-за функции Soft Dice Loss - PullRequest
0 голосов
/ 21 июня 2020

У меня есть изображения формы (216, 216,3) как маски наземной истины и мои предсказанные маски , хранящиеся в numpy массивах: mask_array и output_array , как показано ниже.

CATEGORIES = ["Mask", "Output"]
mask_array = []; output_array = []
for category in CATEGORIES:  
    path = os.path.join(DATADIR, category)
    if category == "Mask":
        for img in sorted(os.listdir(path)):  
            image = cv2.imread(os.path.join(path,img))# ,cv2.IMREAD_GRAYSCALE)
            mask_array.append(image)
    elif category == "Output":
        for img in sorted(os.listdir(path)):
            image = cv2.imread(os.path.join(path,img))# ,cv2.IMREAD_GRAYSCALE)
            output_array.append(image)

Я определил эту функцию гибкой потери кубиков :

def soft_dice_loss(y_true, y_pred, epsilon=1e-6): 


    # skip the batch and class axis for calculating Dice score
    axes = tuple(range(1, len(y_pred.shape)-1)) 
    numerator = 2. * np.sum(y_pred * y_true, axes)
    denominator = np.sum(np.square(y_pred) + np.square(y_true), axes)

    return 1 - np.mean(numerator / (denominator + epsilon))

Затем я преобразовал их как тензоры :

import tensorflow as tf
mask_array = tf.convert_to_tensor(
    mask_array, dtype=None, dtype_hint=None, name=None
)
output_array = tf.convert_to_tensor(
    output_array, dtype=None, dtype_hint=None, name=None
)

print(dice_coef(mask_array, output_array))

Теперь я думаю, что получаю неверный результат потерь, так как я не получаю 0 всякий раз, когда пытаюсь это сделать:

print("Predicted Mask vs Original Mask:", soft_dice_loss(mask_array, output_array))
print("Mask + Mask", soft_dice_loss(mask_array, mask_array))

Скорее, я получил такие результаты:

Прогнозируемая маска против исходной маски: 0,7362082990198698

Исходная маска против исходной маски: 0,019607843137261938

Я должен получить ноль в качестве второго результата. Не так ли? Подскажите, пожалуйста, в чем была ошибка?

...