ML Model Overfits, если входные данные нормализованы - PullRequest
2 голосов
/ 24 октября 2019

Пожалуйста, помогите мне понять, почему моя модель подходит больше, если мои входные данные нормализованы до [-0,5. 0.5], в то время как в противном случае он не подходит.

Я решаю проблему регрессии ML, пытаясь определить местоположение 4 ключевых точек на изображениях. Для этого я импортирую предварительно обученный ResNet 50 и заменяю его верхний слой следующей архитектурой:

  • Сглаживающий слой сразу после ResNet
  • Полностью подключенный (плотный) слой с 256 узлами, за которым следуетАктивация LeakyRelu и нормализация партии
  • Еще один слой Fully Connected со 128 узлами, за которым следуют LeakyRelu и нормализация партии
  • Последний слой Fully Connected (с 8 узлами), которые дают мне 8 координат (4 X и 4Да) из 4 ключевых точек.

Поскольку я придерживаюсь Keras framework, я использую ImageDataGenerator для создания потока данных (изображений). Поскольку выходные данные моей модели (8 чисел: 2 координаты для каждой из 4 ключевых точек) нормализованы до диапазона [-0,5, 0,5], я решил, что входные данные для моей модели (изображений) также должны быть в этом диапазоне, и поэтому его нормализовали дотот же диапазон, используя preprocessing_function в Keras 'ImageDataGenerator.

Проблема появилась сразу после того, как я начал тренировку модели. Я заморозил всю ResNet (training = False), имея в виду сначала переместить градиенты верхних слоев в должную степень, а только затем разморозить половину ResNet и настроить модель. Когда тренировки с ResNet зависли, я заметил, что моя модель страдает от переоснащения сразу после пары эпох . Удивительно, но это происходит даже при том, что мой набор данных довольно приличный по размеру (25k изображений) и используется нормализация партии.

Что еще более удивительно, проблема полностью исчезнет, ​​если я перейду от нормализации ввода к [-0,5, 0,5] и продолжу предварительную обработку изображений с использованием tf.keras.applications.resnet50.preprocess_input. Этот метод предварительной обработки НЕ нормализует данные изображения и неожиданно для меня приводит к правильному обучению модели без переоснащения.

Я пытался использовать Dropout с различными вероятностями, регуляризация L2 ,Также попытался уменьшить сложность моей модели за счет уменьшения количества верхних слоев и количества узлов в каждом верхнем слое. Я играл с скорость обучения и размер партии . Ничего действительно не помогло, если мои входные данные нормализованы , и я понятия не имею, почему это происходит.

ВАЖНОЕ ПРИМЕЧАНИЕ : когда вместо ResNet используется VGG, кажется, что все работаетхорошо!

Я действительно хочу выяснить, почему это происходит.


UPD: проблема была вызвана 2 причинами: - слои нормализации партии в ResNet не работали должным образом при остановке - предварительная обработка изображения для ResNet должна выполняться с использованием Z-показателя

После двух упомянутых выше исправлений, похоже, все работает хорошо!

...