нейронная сеть сходится слишком быстро и предсказывает пустые результаты - PullRequest
0 голосов
/ 01 сентября 2018

Я использую модель UNet для обучения алгоритма сегментации с примерно 1000 медицинских изображений в градациях серого и 1000 соответствующими масками, где интересующий участок в медицинском изображении имеет белый пиксель, а фон - черный.

Я использую потерю игральных костей и аналогичную оценку игральных костей в качестве показателя точности, чтобы учесть тот факт, что мои белые пиксели, как правило, меньше, чем пиксели черного фона. Но у меня все еще есть некоторые проблемы при обучении

1) Потери сходятся слишком быстро. Если у меня скорость обучения моего оптимизатора SGD, например, 0,01, примерно в 2 эпохи потери (обучение и проверка) упадут до 0,00009, и точность возрастет и оседает на 100% пропорционально. Тестирование на невидимом наборе дает пустые изображения.

Предположение - переоснащение: Я предположил, что это произошло из-за переоснащения, поэтому я максимально расширил набор данных жесткими преобразованиями - переворачиванием и вращением, но все равно не помогло. Кроме того, если я проверяю модель на основе тех же данных, которые использовались для ее обучения, она все равно предсказывает пустые изображения. Значит ли это, что это не случай переоснащения?

2) Модель не выглядит даже как тренировочная. Мне удалось проверить модель, прежде чем она превратила все данные теста в черноту, но даже тогда результаты выглядели как размытые версии оригинал без сегментирования функций, выделенных моей тренировочной маской

3) Графики потерь по сравнению с эпохами и точностью по сравнению с эпохами очень гладкие: Они не демонстрируют никакого колебательного поведения, которое я ожидаю увидеть при выполнении семантической сегментации. Согласно этому посту, связанному с , гладкий график обычно происходит, когда существует только один класс. Однако я предположил, что моя модель увидит тренировочные маски (белые пиксели против черных пикселей) и увидит это как проблему двух классов. Я ошибаюсь в этом предположении?

4) Согласно эта игральная кость хороша для несбалансированного тренировочного набора. Я также пытался получить точные / отзывные / F1 результаты, как они предполагают, но не смог этого сделать, и предположил, что это может быть связано с моей третьей проблемой, где модель рассматривает мою задачу сегментации как отдельную проблему класса.

TLDR: Как я могу исправить результаты черного вывода, которые я получаю? Не могли бы вы помочь мне уточнить, видит ли моя модель обучения мои белые и черные пиксели в каждой маске как два отдельных класса, и если нет, то что на самом деле делает?

1 Ответ

0 голосов
/ 01 сентября 2018

Ваша модель предсказывает только один класс (фон / задние пиксели) из-за дисбаланса класса.

Потеря сходится слишком быстро. Например, если скорость обучения моего оптимизатора SGD равна 0,01, то примерно в 2 эпохи потери (обучение и проверка) упадут до 0,00009, а точность возрастет и достигнет 100% пропорционально. Тестирование на невидимом наборе дает пустые изображения.

Понизьте скорость обучения. 0.01 действительно высокий, поэтому попробуйте что-то вроде 3e-5 для изучения и посмотрите, как работает ваша модель. Кроме того, наличие 100% точности (предположительно, вы используете кости?) Предполагает, что вы все еще используете точность, поэтому я считаю, что ваша модель не распознает, что вы используете потерю кубика / кости для обучения и оценки (фрагменты кода) был бы признателен).

Пример:

model.compile(optimizer=Adam(lr=TRAIN_SEG_LEARNING_RATE),              
              loss=dice_coef_loss, 
              metrics=[dice_coef])

Также, если я протестирую модель на основе тех же данных, которые я использовал для ее обучения, она все равно предсказывает пустые изображения. Значит ли это, что это не случай переоснащения?

Попробуйте использовать model.evaluate(test_data, test_label). Если оцениваемая производительность хорошая (игральная кость должна быть очень низкой, если вы только предсказываете 0), то либо ваши метки испорчены, либо что-то не так с вашим конвейером.

Возможные решения, если ничего не помогает:

  • обязательно пройдите все проверки работоспособности в этой статье
  • Возможно, у вас недостаточно данных, поэтому попробуйте использовать патч-подход со случайными культурами.
  • Добавить больше регуляризации (выпадение, BatchNormalization, InstanceNormalization, увеличение размера входного изображения и т. Д.)
...