Использование вариационного автоэнкодера для создания новых изображений подсолнухов

Введение

С появлением ChatGPT генеративный ИИ стал очень актуальным. Существует несколько подходов к генеративному ИИ, включая GAN и трансформаторы, но здесь мы рассмотрим только один из них; Вариационные автоэнкодеры (VAE).

Мы собираемся посмотреть, как мы можем использовать вариационный автоэнкодер для создания новых изображений подсолнухов на основе общедоступного набора данных Kaggle Flowers.

Что такое вариационный автоэнкодер?

Вариационный автоэнкодер, по сути, учится описывать природу некоторых данных. Затем это описание слегка модифицируется для получения распределения данных. Затем, используя это распределение, можно взять образец в любой точке и восстановить связанные данные.

Автоэнкодер состоит из нескольких компонентов, как показано ниже:

Первый — это «Кодировщик», представляющий собой нейронную сеть, которая выполняет работу по преобразованию данных изображения в сжатые векторы. Эти векторы составляют «скрытое пространство», которое представляет собой абстрактное представление данных, содержащих только наиболее значимую информацию. Последней частью автоэнкодера является «декодер», который, говоря простым языком, является обратным «кодировщику», поскольку он преобразует скрытое пространство обратно в данные изображения.

С помощью этой структуры автоэнкодер может обрабатывать изображения в их скрытые векторы, а затем снова восстанавливать исходные изображения, как показано в примерах ввода/вывода ниже:

Проблема здесь в том, что скрытое пространство на данный момент содержит информацию только об отдельных изображениях, которые были обработаны кодировщиком. Он был эффективно приспособлен только к входным изображениям, и, следовательно, он может реконструировать только те же самые изображения.

Дальнейшее изменение требуется, чтобы обобщить скрытое пространство в распределение всех возможных изображений. Именно это изменение дает вариационным автоэнкодерам возможность генерировать новые и ранее невиданные изображения.

Вместо преобразования входных данных x в скрытое пространство z ​​мы хотим получить распределение, которое будет вероятностью z при заданном x или p(z|x).

Однако, если кодер генерирует вероятность z, сеть становится неспособной к обучению. Чтобы разрешить обратное распространение в сети, мы должны вместо этого взять образец из дистрибутива и реструктурировать его для обратного распространения. Это известно как «трюк репараметризации».

Это изменяет природу автоэнкодера в том смысле, что вместо декодирования точки в скрытом пространстве мы теперь декодируем позицию в распределении. Это позволяет нам выбирать любую желаемую позицию в дистрибутиве, что позволяет создавать новые образы.

Проектирование модели

Теперь мы рассмотрим создание самого вариационного автоэнкодера. Первым шагом является загрузка данных (в данном случае из загруженной копии набора данных Kaggle Flowers).

Изображения загружаются и разбиваются на наборы данных для обучения и тестирования.

Теперь нам нужно создать вспомогательную функцию для выполнения трюка с репараметризацией. Пример ниже основан на коде от Keras.

Теперь приступим к созданию самой модели с помощью функционального API Keras, начиная с энкодера:

Функция кодировщика принимает ранее определенный входной слой, количество измерений, которые мы хотим в скрытом пространстве, и, наконец, размер ядра для сверток.

В этом примере комбинированная свертка и максимальное объединение выполняются три раза, а затем данные выравниваются. Затем берутся среднее значение и логарифмическая дисперсия, которые вводятся в функцию репараметризации для выборочного вывода. Кодер теперь укомплектован одним входом и тремя выходами.

Мы также возвращаем из этой функции форму обработанных данных перед выравниванием, поскольку она будет использоваться декодером для «разглаживания».

Затем декодер строится следующим образом:

Декодер сначала преобразует скрытое пространство обратно в форму обработанных данных изображения перед сведением. Результирующий слой затем сворачивается и подвергается повышающей дискретизации в порядке, обратном кодеру, для получения данных той же формы, что и исходные входные данные.

Последним шагом в разработке модели является создание самого автоэнкодера:

Автоэнкодер создается как декодированный вывод кодировщика. Мы также добавляем в этот момент новую функцию потерь, основанную на методе нижней границы свидетельства (ELBO).

Теперь мы собираем все это вместе, чтобы построить модель автоэнкодера:

В результате получается модель, как показано ниже, которая представляет кодировщик, который берет изображения RGB (128,128,3) и выводит скрытое пространство с 200 измерениями. Затем кодировщик принимает эти 200 измерений в качестве входных данных, а затем реконструирует их обратно в данные изображения RGB формы (128,128,3).

После обучения модели ее можно использовать для создания данных изображения. В приведенном ниже примере декодер используется для создания изображения из случайно выбранной позиции в скрытом пространстве.

Используя этот подход, можно создать новые изображения подсолнухов, как показано ниже:

Заключение

Автоэнкодер может успешно генерировать новые изображения подсолнухов с разумным успехом. Однако качество изображений ограничено объемом обучающих данных (около 1000 изображений) и доступными возможностями обработки. Учитывая увеличение обоих из них, можно было бы ожидать высококачественных изображений.

СТАНЬТЕ ПИСАТЕЛЕМ на MLearning.ai SOTA 3D 2023 // Твой ИИ