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