Код этого проекта можно найти по адресу: https://github.com/evanhu1/pytorch-CelebA-faCeGAN

GAN (генерирующие состязательные сети) представляют собой подмножество моделей обучения без учителя, которые используют две сети наряду с состязательным обучением для вывода «новых» данных, которые напоминают входные данные. Более конкретно, GAN обычно включают «генеративную модель G, которая фиксирует распределение данных, и дискриминативную модель D, которая оценивает вероятность того, что выборка была получена из обучающих данных, а не G [1]».

Условные сети GAN являются модификацией исходной модели GAN, позже предложенной Мехди Мирза и Саймоном Осиндеро в статье Условные порождающие состязательные сети (2014). В cGAN (условный GAN) дискриминатору даются пары данные / метка, а не просто данные, а генератору дается метка в дополнение к вектору шума, указывающая, к какому классу должно принадлежать изображение. Добавление меток заставляет генератор изучать несколько представлений различных классов обучающих данных, что дает возможность явно управлять выходными данными генератора. При обучении модели метка обычно комбинируется с выборкой данных как для генератора, так и для дискриминатора. Код для этого будет приведен ниже.

В этой статье я опишу реализацию условной глубокой сверточной GAN в PyTorch, которая использует английский текст в качестве меток вместо отдельных чисел. Наша модель - это глубокая сверточная сеть GAN (DCGAN), то есть она использует глубокие сверточные слои в своей архитектуре вместо полносвязных слоев, как в исходной статье. Мы будем тренироваться на наборе данных CelebA лиц знаменитостей с кадрированием изображений до 64x64. Наша архитектура модели содержит пять сверточных / транспонированных сверточных слоев с пакетной нормализацией и активацией Leaky ReLU, а также сигмоидной активацией для выходного слоя дискриминатора и активацией tanh для выходного слоя генератора. Используются оптимизатор Адама и потеря двоичной кросс-энтропии.

Параметры и шаги очистки данных руководствуются общепринятым мнением относительно обучения GAN, собранным из таких источников, как GANHacks и оригинальной статьи. К ним относятся скорость обучения 0,0002 (бета 0,5) для оптимизатора Adam, чередующиеся свертки вместо понижающей / повышающей дискретизации, пользовательские инициализации весов с использованием гауссовского распределения (среднее 0,0, стандартное 0,02) и масштабирование реальных изображений от [0, 1] до [- 1, 1], чтобы соответствовать выходу tanh в поддельных изображениях.

Определившись с дизайном, мы написали нашу модель в PyTorch.

Что касается набора данных, CelebA поставляется с 40 аннотациями двоичных атрибутов для каждого изображения, как вы можете видеть в примерах ниже.

Используя эти двоичные атрибуты в качестве меток или условий, мы можем обучить наш cGAN генерировать лица с определенными функциями, которые мы контролируем. Кроме того, мы можем выбрать несколько атрибутов для обучения и обучения, просто объединяя их в многомерные метки. Имея достаточное количество атрибутов, мы можем создавать самые разные лица с разными человеческими чертами. Например, наш предварительный результат обучения показал, что модель может изучать бинарные атрибуты [Мужчина, Молодой], что позволяет нам сгенерировать 4 различных комбинации типов лица (молодой мужчина, «немолодой» мужчина, молодая женщина, «немолодой») женский)

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

Для фактического ввода в наши модели мы создали тензоры с горячим кодированием с двумя измерениями вдоль оси метки. В частности, предполагая, что мы используем только два двоичных атрибута с изображениями 64x64 при обучении, генератор получит тензор с множественным горячим кодированием 32x2x1x1 (размер пакета, количество меток и 2 «поддельных» размера изображения для слоя деконволюции) как метка для каждой обучающей выборки. И наоборот, дискриминатор получит тензор с множественным горячим кодированием 32x2x64x64, заполненный нулями и единицами на основе двоичных атрибутов обучающей выборки.

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

На графических процессорах Google Collaboratory обучение занимало около 30 минут на эпоху и давало интересные результаты в среднем к эпохе 5. Мы экспериментировали со стабильным увеличением количества атрибутов, используемых для описания лица в обучающих данных, желая увидеть, насколько cGAN способен обучаться.

С 5 бинарными атрибутами на изображение:

10 атрибутов:

Как вы могли видеть, результаты действительно страдают по мере увеличения количества атрибутов. Учитывая наши ограниченные вычислительные ресурсы и время, мы не заходили слишком далеко за 10 атрибутов, но было бы интересно посмотреть, насколько далеко можно зайти, и сможет ли достаточно большая модель изучить все 40 двоичных атрибутов CelebA.

В качестве дополнительной работы мы также поэкспериментировали с использованием повернутых преобразований в выборках данных CelebA, чтобы увидеть, может ли cGAN изучать не только двоичные атрибуты, но и дополнения, такие как вращение. Вдохновленные статьей Обучение представлению без учителя путем прогнозирования поворота изображений, мы создали образцы, которые были повернуты на 90, 180 и 270 градусов для обучения.

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

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

Благодарности

Этот проект был совместным усилием Джейка Остина, Ариана Джейна и Брайана Лю из Машинного обучения в Беркли.

использованная литература

[1] Генеративные состязательные сети: https://arxiv.org/abs/1406.2661