Пожалуйста, помогите мне понять, почему моя модель подходит больше, если мои входные данные нормализованы до [-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-показателя
После двух упомянутых выше исправлений, похоже, все работает хорошо!