Я пытаюсь выполнить бинарную классификацию с помощью 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
.
То, что я думаю, могло бы помочь в дальнейшем (но еще не пытался)
- Выполнение большего объема данных для одного класса, чем для другого. К сожалению, я использую один
ImageDataGenerator
для всех своих тренировочных данных, и я не знаю, как увеличить один класс больше, чем другой.
- Может быть, пользовательская функция потерь, которая больше наказывает за ложные решения? Как бы я это реализовал? В настоящее время я просто использую
binary_crossentropy
.
- Теоретически я мог бы отрегулировать порог членства в классе для предсказания, но это не поможет с обучением и не улучшит результат, верно?
- Возможно, уменьшите размер партии, как предложено здесь . Но я не понимаю, почему это должно помочь. В настоящее время я определяю размер пакета программно, чтобы показать все данные обучения и проверки сети в одну эпоху:
steps_per_epoch = int(len(train_gen.filenames) / args.batch_size)
validation_steps = int(len(val_gen.filenames) / args.batch_size)
Как вы думаете, я должен заняться первым или у вас есть идея получше? Я также рад за любую помощь с деталями реализации.
Заранее большое спасибо!