Нейронная сеть классифицирует все в один класс, напомним = 1 для несбалансированного набора данных - PullRequest
0 голосов
/ 31 августа 2018

Я пытаюсь выполнить бинарную классификацию с помощью Deep Neural Network (особенно VGG16) в Керасе. К сожалению, у меня очень несбалансированный набор данных (15.000 / 1.800 изображений), но я просто не могу найти способ обойти это ..

Результаты, которые я вижу (по данным обучения и проверки)

  • Напомним = 1
  • Точность = 0.1208 (что является точным соотношением между классами 0 и классами 1 образцов)
  • AUC = 0.88 (после ~ 30 эпох с SGD, который, похоже, 1 - Precision)

Что я сделал

  • Переключение с метрики потерь / точности на AUC с this little helper
  • Использование class_weight, как описано здесь , которое, кажется, не помогает
  • Пробуем разные оптимизаторы (SGD, Adam, RMSProp)
  • Добавление BatchNormalization слоев в мой (необученный) VGG16 и установка use_bias в False на сверточных слоях. Смотрите всю мою сеть как гист здесь .
  • Выполнение дополнения для увеличения набора данных со встроенным Keras ImageDataGenerator.

То, что я думаю, могло бы помочь в дальнейшем (но еще не пытался)

  1. Выполнение большего объема данных для одного класса, чем для другого. К сожалению, я использую один ImageDataGenerator для всех своих тренировочных данных, и я не знаю, как увеличить один класс больше, чем другой.
  2. Может быть, пользовательская функция потерь, которая больше наказывает за ложные решения? Как бы я это реализовал? В настоящее время я просто использую binary_crossentropy.
  3. Теоретически я мог бы отрегулировать порог членства в классе для предсказания, но это не поможет с обучением и не улучшит результат, верно?
  4. Возможно, уменьшите размер партии, как предложено здесь . Но я не понимаю, почему это должно помочь. В настоящее время я определяю размер пакета программно, чтобы показать все данные обучения и проверки сети в одну эпоху: steps_per_epoch = int(len(train_gen.filenames) / args.batch_size) validation_steps = int(len(val_gen.filenames) / args.batch_size)

Как вы думаете, я должен заняться первым или у вас есть идея получше? Я также рад за любую помощь с деталями реализации.

Заранее большое спасибо!

1 Ответ

0 голосов
/ 31 августа 2018

Возможно, попытайтесь подготовить сбалансированные партии (включая удвоения класса 1), как описано в https://community.rstudio.com/t/ensure-balanced-mini-batches-while-training/7505 (R Studio). Также читайте Нейронные сети - Работа с несбалансированным набором данных и балансировка несбалансированного набора данных с генератором изображений keras

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...