Сеть сегментации в Keras сходится к одному классу во время обучения

#python #tensorflow #keras #neural-network #image-segmentation

#python #тензорный поток #keras #нейронная сеть #изображение-сегментация

Вопрос:

Я пытаюсь реализовать RefineNet в Keras с помощью серверной части Tensorflow. Я использую интерфейс ResNet-101 и предварительно обученные веса из https://gist.github.com/flyyufelix/65018873f8cb2bbe95f429c474aa1294 . Модель успешно компилируется, но не сходится во время обучения: она всегда сходится к одному классу всего после 1-5 шагов обучения.

Список вещей, которые я пробовал / хотя:

  • Входные данные закодированы в однократном кодировании
  • Входные изображения имеют правильные соответствующие маски
  • Функция потерь является категориальной кроссэнтропией
  • Предварительно обученные веса верны, интерфейс правильно классифицирует входные изображения (например, cats)
  • Замораживание / размораживание интерфейсных слоев, похоже, не имеет значения
  • Разные оптимизаторы (Adam, SGD), разные скорости обучения (0.01 — 0.000001)
  • Сеть даже не сходится / не подходит для одной обучающей выборки
  • Дисбаланс классов: я пытался использовать взвешенную потерю, не помогло. Кроме того, сеть не всегда сходится к самому большому классу.
  • Проверил сетевые графики и сравнил их с архитектурой из документа RefineNet.
  • Может быть какая-то проблема с инициализацией, но инициализация Keras по умолчанию — glorot_uniform для ядер и нулей для смещений, не могу придумать ничего лучше.
  • Все RELUS могли умереть, но это не должно произойти после нескольких шагов обучения, верно? Я пробовал LeakyReLU, не помогло.
  • Пробовал разные размеры входных данных, размеры пакетов, произвольную обрезку, соотношения сторон (на данный момент был в отчаянии).
  • Пробовал вводить случайный шум, такое же поведение.

Последний момент заставляет меня думать, что архитектура просто игнорирует входные данные, но я понятия не имею, где, как и почему.

Пример вывода во время обучения:

 Training:
Step 0, loss 15.566238403320312, acc 0.012790679931640625
Step 1, loss 9.91278076171875, acc 0.36734771728515625
Step 2, loss 10.994621276855469, acc 0.27989959716796875
Step 3, loss 10.00101375579834, acc 0.3611602783203125
Step 4, loss 11.439224243164062, acc 0.2010345458984375
Step 5, loss 11.397968292236328, acc 0.229278564453125
Step 6, loss 9.844161987304688, acc 0.3711433410644531
Step 7, loss 9.981706619262695, acc 0.36286163330078125
Step 8, loss 11.335559844970703, acc 0.21475982666015625
Step 9, loss 9.997631072998047, acc 0.3608970642089844
...
  

Полный код можно найти в следующей записной книжке Google Colab: https://colab.research.google.com/drive/1OlujuKZYhRaTm9h7rHAPEi9gkiYmQLR_

Я постарался максимально упростить воспроизведение проблемы.

Любая помощь / идеи будут высоко оценены!

Ответ №1:

Добавление слоев пакетной нормализации после слоев conv решило проблему.