Порог выходных данных сегментации изображения модели керас - PullRequest
1 голос
/ 20 февраля 2020

Я реализовал U- Net в Keras для проблемы сегментации изображения, над которой я работаю. Я обнаружил, что результаты ранних эпох дают очень хорошие результаты, хотя и с низкой вероятностью. По мере продолжения обучения и увеличения IoU я получаю меньше пикселей в выводе, но они имеют более высокую вероятность.

Чтобы быть более кратким, мой вывод пропускает определенные функции, но имеет более высокие вероятности в функциях, которые он идентифицирует.

Мне интересно знать, могу ли я исправить это, заставив значения пикселов быть 1 после выходного слоя с функцией активации сигмоида. Есть ли простой способ сделать это? Я использую binary_crossentropy в качестве функции потерь, поэтому я надеялся, что смогу сделать что-то вроде:

def binary_crossentropy_thresh(y_true,y_pred):
    y_pred[y_pred>=0.2] = 1

    return binary_crossentropy(y_true,y_pred)

Но это не сработает на Тензорах. Буду очень признателен за любые предложения.

Извинения, если я недостаточно объяснил свою проблему.

1 Ответ

1 голос
/ 20 февраля 2020

Нет, вы не можете преобразовать свою функцию в константу. Он не будет дифференцируем (по весу), и вы не сможете тренироваться.

Вы можете сделать это в «пользовательских метриках », ни в модели, ни в потере.


Убедитесь, что ваша потеря IoU рассчитывается "по изображениям", а не "по партиям". Чем более общая потеря, тем меньше она заметит крошечные вещи. Потери по частям могут игнорировать целые изображения, если эти изображения имеют меньшую площадь, чем другие.

Хорошим предложением функции потери, которая работала для меня, была потеря Lovasz.


Вы также можете попробовать веса выборки (лучше всего работает с одноканальными масками):

total_pixels = y_train.sum(axis=(1,2,3))
mean_pixels = total_pixels.mean(axis=0)
sample_weights = mean_pixels / total_pixels
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...