Давным-давно, читая о генеративных моделях и глубоком обучении, я наткнулся на автокодировщики. Первая мысль, которая пришла мне в голову, — могу ли я использовать их для генерации данных изображения. Я уверен, что некоторые из вас задумывались об этом раньше. Поэтому в этой статье я хочу предоставить эмпирические результаты и ответить на этот вопрос. Этот пост содержит базовую реализацию автокодировщиков и вариационных автокодировщиков PyTorch. Я также проверяю способность обоих этих методов генерировать изображения, аналогичные набору данных FashionMNIST. Людям, заинтересованным в прочтении краткой статьи о различных видах автокодировщиков, следует прочитать Статья в блоге Лилиан Венг.

Автокодировщики

Автокодировщики — это модели, которые используются для кодирования любой формы данных. Они состоят из двух видов сетей — Encoder и Decoder.

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

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

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

Функция __init__ автокодировщика содержит уровни кодировщика и декодера. Сеть не очень глубокая, так как она здесь только для простого сравнения между автокодировщиками и вариационными автоэнкодерами.

Этот модуль можно обучить на объекте DataLoader, который можно легко создать в наборе данных FashionMNIST.

После запуска модели в течение 100 эпох на обучающем наборе данных FashionMNIST потери при реконструкции (в данном случае MSELoss) были намного меньше. Результаты декодера для пакета изображений показаны вместе с исходным пакетом.

Чтобы иметь возможность «генерировать» изображения, нам нужно было бы предоставить случайное изображение декодерной части сети автокодировщика. Затем мы сможем построить изображения.

Наконец, результаты были следующими:

Мы видим, что ни одно из изображений не имеет хорошего сходства ни с одним из реальных изображений. И трудно увидеть какой-либо конкретный класс в «сгенерированных» изображениях.

Вариационные автоэнкодеры

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

Я буду использовать очень простую реализацию вариационных автокодировщиков, в которой используется KL Divergence Loss, аналогичная той, что обсуждалась в этом посте StackOverflow.

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

Обучение выполняется аналогично автокодировщикам, за исключением того, что к термину потерь добавляется потеря расхождения KL:

Существуют сложные и, вероятно, более совершенные реализации вариационного автокодировщика, но я использовал эту из-за ее простоты.

Мы проверяем, хорошо ли вариационный автокодер справляется с реконструкцией изображений или нет. Результаты показаны ниже :

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

Однако изображения, сгенерированные вариационным автоматическим кодировщиком, намного лучше, чем автоматические кодировщики.

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

Сгенерированные изображения показаны ниже:

Мы видим, что, несмотря на «перекрытие» различных объектов на изображениях, некоторые изображения обуви и брюк почти идеальны. Мы также можем видеть, что модель смещена в сторону обуви и штанов, но следует отметить, что количество эпох, количество нейронов в скрытом слое, тип сети (полностью связанная/сверточная/рекуррентная) также влияет на генерацию изображений. Кроме того, такая же архитектура была предоставлена ​​автокодировщику, но он не так хорошо работает.

В заключение ответ такой: нет, автокодировщики плохо генерируют изображения.

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