Вопрос или проблема
В общем, U-Net нужен для создания изображения в другом стиле, но с сохранением структуры. Например, полноценный рисунок из эскиза. Верно?
Я хочу сохранить стиль, но изменить структуру. Например, я хочу взять фото с смятой тканью и получить развернутую ткань. Но я не хочу использовать GAN. Для этого я решил убрать пропуски из U-Net, которые сохраняют структуру. И также я сворачиваю входное изображение в вектор стиля, как в GAN. Верно?
Проблема в том, что этот код успешно обучается, но только если в учебной базе данных нет аугментации. Как только я добавляю к входному изображению (только к входному, так как выход должен оставаться неизменным) угловую аугментацию +/- 5, 10 и 15 градусов, то вместо результата я получаю какой-то шум. Если я начинаю обучение на наборе данных из нескольких примеров, то результат правильный при применении аугментации. Но по мере увеличения числа примеров в наборе данных результат становится хуже.
Но в любом случае моя кривая (Loss:MSE) идеальна ))) Я имею в виду, даже если я получаю какой-то шум в результате (изображение), моя кривая выглядит так, будто я получаю идеальный результат. Просто падающая кривая. И это меня больше всего раздражает. Я не понимаю, как это возможно. Даже если я получаю какой-то шум в результате (изображение), кривая падает, как будто все в порядке. Примерно 0,09/0.05/0.02/0.01/…. Я называю это переобучением просто потому, что не знаю, что это такое. Я имею в виду, когда я не получаю правильный результат, но у вас падает кривая потерь, это называется переобучением. Верно?
Что касается мощности моей модели. Конечно, я думал об этом и изменял количество слоев, фильтров в слоях и нейронов в плотных слоях, но без успеха. Поэтому я думаю, что здесь есть какая-то концептуальная проблема.
Я использую некоторые примеры из учебного набора данных в качестве валидации, потому что хочу быть уверенным, что эта модель может корректно работать как минимум с моими учебными данными. Но, как я уже говорил, с аугментацией я получаю какой-то шум с идеальными потерями (MSE). Неважно, сколько эпох я использую – результат мусорный, кривая идеальна. Скорость обучения = 0.00006 * K (K = 5,4,3,2,1). Вход/выход – изображение (2562563). Adam.
l2_reg = regularizers.l2(1e-6)
initializer = initializers.he_normal()
def build_unet(input_shape=(256, 256, 3)):
inputs = layers.Input(shape=input_shape)
c = layers.Conv2D(16, kernel_size=4, strides=2, padding="same")(inputs)
c = layers.LeakyReLU(negative_slope=0.2)(c)
c = layers.Conv2D(32, kernel_size=4, strides=2, padding="same")(c)
c = layers.LeakyReLU(negative_slope=0.2)(c)
c = layers.Conv2D(64, kernel_size=4, strides=2, padding="same")(c)
c = layers.LeakyReLU(negative_slope=0.2)(c)
c = layers.Conv2D(128, kernel_size=4, strides=2, padding="same")(c)
c = layers.LeakyReLU(negative_slope=0.2)(c)
c = layers.Conv2D(256, kernel_size=4, strides=2, padding="same")(c)
c = layers.LeakyReLU(negative_slope=0.2)(c)
c = layers.Conv2D(512, kernel_size=4, strides=2, padding="same")(c)
c = layers.LeakyReLU(negative_slope=0.2)(c)
# Узкое место
b = InstanceNormalization()(c)
b = layers.Reshape((-1,))(b)
b = layers.Dense(1024, kernel_regularizer=l2_reg,)(b)
b = layers.LeakyReLU(negative_slope=0.2)(b)
b = layers.Dropout(0.2)(b)
b = layers.Dense(1024*4*4, kernel_regularizer=l2_reg,)(b)
b = layers.LeakyReLU(negative_slope=0.2)(b)
b = layers.Reshape((4,4,1024))(b)
# Декодер
d = layers.Conv2DTranspose(512, kernel_size=4, strides=2, padding="same")(b)
d = layers.LeakyReLU(negative_slope=0.2)(d)
d = layers.Conv2DTranspose(256, kernel_size=4, strides=2, padding="same")(d)
d = layers.LeakyReLU(negative_slope=0.2)(d)
d = layers.Conv2DTranspose(128, kernel_size=4, strides=2, padding="same")(d)
d = layers.LeakyReLU(negative_slope=0.2)(d)
d = layers.Conv2DTranspose(64, kernel_size=4, strides=2, padding="same")(d)
d = layers.LeakyReLU(negative_slope=0.2)(d)
d = layers.Conv2DTranspose(32, kernel_size=4, strides=2, padding="same")(d)
d = layers.LeakyReLU(negative_slope=0.2)(d)
d = layers.Conv2DTranspose(16, kernel_size=4, strides=2, padding="same")(d)
d = layers.LeakyReLU(negative_slope=0.2)(d)
outputs = layers.Conv2D(3, kernel_size=3, padding="same", activation="tanh")(d)
model = models.Model(inputs=inputs, outputs=outputs, name="build_unet")
return model
unet = build_unet()
adam_optimizer = Adam(
learning_rate=0.00006*K,
)
unet.compile(optimizer=adam_optimizer, loss="mse", metrics= None)
Да, возможно реализовать задачу Image-to-Image с использованием U-Net без пропусков, но это значительно снизит способность модели захватывать высокоуровневые признаки из более ранних слоев, что является одной из ключевых сил архитектуры U-Net. U-Net обычно известен своим использованием пропусков, которые помогают передавать детальную пространственную информацию от.encoder к декодеру, что делает его очень эффективным для таких задач, как сегментация изображений и перевод изображений.
Без пропусков сеть может испытывать трудности с сохранением тонких деталей, что приводит к менее точным или низкокачественным выходным данным, особенно для задач, требующих высокой точности, таких как сегментация медицинских изображений или суперразрешение. Однако все-таки возможно модифицировать архитектуру U-Net для определенных случаев использования, но это может потребовать других техник, чтобы компенсировать потерю информации, которую предоставляют пропуски.
Ответ или решение
Изображение в изображение с использованием U-Net без пропускных соединений: это реально?
Введение
U-Net — это мощная архитектура нейронных сетей, изначально предназначенная для задач сегментации изображений. Основной принцип U-Net заключается в использовании пропускных соединений, которые помогают сохранять пространственную информацию в процессе обучения. Однако вы задаетесь вопросом: возможно ли адаптировать U-Net для задач преобразования изображений без использования этих пропускных соединений и при этом достичь желаемых результатов? В данной статье мы рассмотрим ключевые моменты, а также возможные проблемы, возникающие в процессе обучения таких моделей.
Структура и особенности U-Net
U-Net изначально разработан с учетом многих аспектов, включая:
- Структурные пропускные соединения: Они обеспечивают передачу детальной информации из кодировщика в декодер, что критично для сохранения деталей выходного изображения.
- Кодировщики и декодеры: U-Net состоит из двух частей, где первый отвечает за сжатие данных, а второй — за их восстановление.
Удаление пропускных соединений
Убирая пропускные соединения, вы фактически снижаете способность модели к захвату сложных структур и деталей. Это может привести к:
- Потере информации: Запись высокой детализации на выходе может стать трудной.
- Низкому качеству изображений: В результате можно получить шумные или размытые изображения, особенно в сложных задачах, таких как преобразование стиля.
Проблемы с обучением
Вы описываете, что ваша модель показывает идеальную кривую потерь (Loss) при использовании среднеквадратичной ошибки (MSE), однако результаты изображений выглядят как шум. Это часто происходит из-за:
- Переобучения: Если модель адаптируется к данным без реального понимания их структуры, это приводит к ситуации, когда она “запоминает” данные, а не обучается их обобщению.
- Проблем с аугментацией: При добавлении аугментации, такой как угловая аугментация, модель может не справляться с изменениями, так как теряет всю полезную информацию, полученную из пропускных соединений.
- Дефицит данных: Ваша модель может работать на небольших выборках данных, но с увеличением их числа происходит ухудшение качества, поскольку разнообразие данных не поддерживается недостаточной сложностью модели.
Рекомендации
Для решения этих проблем можно рассмотреть следующие подходы:
- Вернуться к архитектуре с пропускными соединениями: Это даст модели возможность сохранять детальную пространственную информацию.
- Увеличить количество данных для обучения: Более разнообразные данные могут помочь модели лучше обобщать информацию.
- Экспериментировать с гиперпараметрами: Оцените различные значения скорости обучения и регуляризации, чтобы предотвратить переобучение.
Заключение
С учетом описанных деталей можно утверждать, что создание модели Image-to-Image с использованием U-Net без пропускных соединений действительно возможно, но это приведет к значительным ограничениям в производительности. Для достижения высококачественных результатов стоит рассмотреть возврат к оригинальной архитектуре с пропускными соединениями и оптимизацию подхода к обучению. Это будет наиболее эффективным путем к успеху в ваших задачах преобразования изображений.