Вопрос или проблема
У меня есть серия из 15 кадров (60 строк x 50 столбцов). На протяжении этих 15 кадров луна движется от верхнего левого угла к нижнему правому углу.
Данные = https://github.com/aiqc/AIQC/tree/main/remote_datum/image/liberty_moon
Я пытаюсь создать авто编码ер с продвижением вперед, где:
- Входные данные – это изображение 60×50.
- Этикетка оценки – это изображение 60×50 из через 2 кадра.
- Все данные масштабированы в диапазоне от 0 до 1.
model = keras.models.Sequential()
model.add(layers.Conv1D(64*hp['multiplier'], 3, activation='relu', padding='same'))
model.add(layers.MaxPool1D( 2, padding='same'))
model.add(layers.Conv1D(32*hp['multiplier'], 3, activation='relu', padding='same'))
model.add(layers.MaxPool1D( 2, padding='same'))
model.add(layers.Conv1D(16*hp['multiplier'], 3, activation='relu', padding='same'))
model.add(layers.MaxPool1D( 2, padding='same'))
model.add(layers.Conv1D(16*hp['multiplier'], 3, activation='relu', padding='same'))
model.add(layers.UpSampling1D(2))
model.add(layers.Conv1D(32*hp['multiplier'], 3, activation='relu', padding='same'))
model.add(layers.UpSampling1D(2))
model.add(layers.Conv1D(64*hp['multiplier'], 3, activation='relu'))
model.add(layers.UpSampling1D(2))
model.add(layers.Conv1D(50, 3, activation='sigmoid', padding='same'))
# последний слой пробовал с сигмоидой и BCE потерей.
# последний слой пробовал с relu и MAE.
Учебники говорят использовать последний слой с сигмоидой и потерей BCE, но значения, которые я получаю, вероятно, не должны находиться в диапазоне от 0 до 1, потому что потеря уходит в сильно отрицательное значение.
Если я использую последний слой relu с потерей MAE, он, похоже, обучается чему-то.
Но предсказанное изображение не очень хорошее:
Авто编码еры изображений отлично подходят для изменения стиля, но не так хороши для изменения содержания.
В любом случае, поскольку вы оставляете ~95% нетронутым в вашей трансформации, ResNet
вероятно, будет очень полезен!
Если вы используете сеть песочных часов
, вы увидите, как она быстро сходит на нет в само编码ер (что примерно на 95% правильно) и затем сосредоточьтесь на всей тренировке только на разнице (часть с луной).
Ответ или решение
Проблема, с которой вы сталкиваетесь при использовании автоэнкодеров для прогнозирования перемещения Луны на изображениях, представляет собой достаточно распространённый случай, связанный с ограничениями традиционных архитектур сетей, особенно в контексте изменений контента в изображении.
Проблема с Обучением Автоэнкодера
В вашем случае задача заключается в том, чтобы предсказать изображение, соответствующее текущему кадру с учетом его состояния через два кадра (или через два временных шага). При этом изображение имеет размеры 60×50 пикселей. Важно учитывать, что автоэнкодеры хорошо подходят для стиля и текстуры, но могут демонстрировать сложности в обучении, когда речь идет о значительных изменениях в содержимом.
Архитектура Модели
Вы используете архитектуру, основанную на сверточных слоях с последовательным уменьшением и увеличением разрешения. Однако имеет смысл проанализировать несколько моментов, которые могут повлиять на эффективность обучения:
-
Сверточные Слои: Для обработки изображений вместо
Conv1D
следует использоватьConv2D
, так как ваши входные данные представляют собой двумерные изображения. Это может значительно улучшить способность модели извлекать пространственные особенности. -
Выходной Слой и Функция Потерь: Если ваши выходные значения не попадают в диапазон 0-1, это может указывать на проблемы с функцией активации выходного слоя или применяемой функцией потерь. Вы можете попробовать:
- Использовать
sigmoid
в сочетании сbinary_crossentropy
(BCE), но убедиться, что ваши данные предварительно нормализованы. - Вариант с
relu
иmean_absolute_error
(MAE) может быть более подходящим, если вы ожидаете, что значения могут выходить за пределы [0,1].
- Использовать
-
Архитектурные Изменения: Рассмотрите возможность использования более сложных сетей, таких как ResNet или Hourglass. Эти архитектуры лучше справляются с извлечением признаков и могут помочь в фокусировке на важных изменениях, таких как перемещение Луны. Hourglass сети, в частности, могут сосредоточиться на различиях между кадрами.
Альтернативные Подходы
-
Изменение Стратегии Обучения: Подумайте о перенастройке подхода к обучению. Возможно, вам стоит рассмотреть бинарную классификацию таких областей, как фон и предмет (Луна), чтобы модель могла сосредоточиться на основных изменениях.
-
Увеличение Данных: Если возможно, примените техники увеличения данных (data augmentation) для создания новых примеров, что позволит улучшить обобщающую способность вашей модели.
-
Тестирование с Разными Параметрами: Экспериментируйте с гиперпараметрами вашей модели, такими как количество фильтров, размер ядра, скорость обучения и параметры регуляризации. Рекомендуется использовать адаптивные оптимизаторы, такие как Adam или RMSprop.
Заключение
Ваши наблюдения о том, что автоэнкодеры и ResNet могут эффективно работать для задач с небольшими изменениями в содержании, являются правильными. Учитывая вашу задачу, более твёрдый подход с использованием более сложных архитектур, таких как ResNet или Hourglass, в сочетании с правильными стратегиями обучения и тестирования, может предоставить вам значительное улучшение в качестве прогнозируемых изображений. Пробуйте различные подходы и изучайте их результаты, чтобы определить наиболее эффективные решения для вашей конкретной задачи.