Изучите InfoGAN и создайте свою собственную сеть InfoGAN для создания рукописных цифр MNIST для конкретных функций

На изображении выше вы можете сказать, какие рукописные цифры синтезируются машиной, а какие - людьми? Ответ: все они синтезированы машиной! Фактически, это изображение взято из научной статьи InfoGAN: обучение интерпретируемому представлению с помощью информации, максимизирующей генеративные состязательные сети, где авторы разработали специальную генерирующую состязательную сеть под названием InfoGAN (информационная максимизация генеративной враждебной сети). »И использовал его для синтеза рукописных цифр MNIST. Как вы, возможно, знаете, GAN широко используются для синтеза новых данных, особенно изображений. Однако одним из недостатков обычных сетей GAN является то, что мы не можем контролировать изображения, создаваемые сетями GAN. Например, GAN, который обучен создавать поддельные рукописные цифровые изображения, может создавать очень реальные рукописные цифровые изображения, но мы не можем контролировать, какое число он генерирует. InfoGAN решил эту проблему: сеть может научиться создавать изображения с определенными категориальными характеристиками (такими как цифры от 0 до 9) и непрерывными функциями (такими как угол поворота цифр) без присмотра. Кроме того, поскольку обучение осуществляется без учителя, оно способно находить шаблоны, скрытые среди изображений, и генерировать изображения, которые следуют этим скрытым шаблонам. Иногда модель может выучить очень интересные паттерны, которые выходят за рамки вашего воображения (например, одна из моих моделей учится переходить от числа 2 к числу 8. Вы увидите это позже!). В этой записной книжке я расскажу, как InfoGAN обеспечивает контроль над создаваемыми изображениями и как построить InfoGAN с нуля для синтеза рукописных цифр MNIST для конкретных функций, как на изображении выше.

Структура InfoGAN

Обычный GAN имеет два основных элемента: генератор, который принимает случайные шумы и создает поддельные изображения, и дискриминатор, который принимает как поддельные, так и настоящие изображения и определяет, является ли изображение настоящим или поддельным. Во время обучения генератор «наказывается», если дискриминатор успешно определяет, что создаваемое им изображение является фальшивым. Таким образом, генератор научится создавать фальшивые изображения, которые все больше и больше похожи на настоящие, чтобы «обмануть» дискриминатор.

В InfoGAN, чтобы контролировать типы создаваемых изображений, нам необходимо передать дополнительную информацию поверх случайных шумов в генератор и заставить его использовать эту информацию при создании поддельных изображений. Дополнительная информация, которую мы вводим, должна относиться к типам функций, которые мы хотим, чтобы изображения имели. Например, если мы хотим получить определенные цифры MNIST, нам нужно передать категориальный вектор, содержащий целые числа от 0 до 9; если мы хотим получить цифры MNIST с разными углами поворота, мы можем захотеть подавать числа с плавающей запятой, случайно выбранные от -1 до 1.

Подача дополнительной информации проста, так как нам просто нужно добавить дополнительные входные данные в модель генератора. Но как мы можем гарантировать, что генератор будет использовать информацию вместо того, чтобы полностью ее игнорировать? Если мы по-прежнему обучаем генератор просто на основе отклика дискриминатора, генератор не будет использовать дополнительную информацию, поскольку дополнительная информация не поможет генератору создавать более реалистичные изображения (это полезно только для генерации определенных характеристик изображений. ). Таким образом, нам нужно применить дополнительные «штрафы» к генератору, если он не использует дополнительную информацию. Один из способов - добавить дополнительную сеть (часто называемую вспомогательной сетью и обозначаемую Q), которая принимает поддельные изображения и воспроизводит дополнительную информацию, которую мы вводим в генератор. Таким образом, генератор вынужден использовать дополнительную информацию, как если бы он этого не делал, вспомогательная сеть не может правильно воспроизвести дополнительную информацию, и генератор будет «оштрафован». На рисунке ниже представлена ​​структура GAN (слева) и InfoGAN (справа).

Примечание: в статье теоретически нужно обучать генератор через максимизацию взаимной информации. Однако взаимную информацию вычислить практически невозможно. Поэтому авторы аппроксимируют взаимную информацию, и аппроксимация становится кросс-энтропией (то есть разностью) между входами дополнительной информации и воспроизводимой информации. Если вас интересует взаимная информация и ее приближение, вы можете ознакомиться с оригинальной статьей или двумя очень хорошими средними статьями от Zak Jost и Jonathan Hui.

Сборка InfoGAN

Поняв структуру InfoGAN, давайте поработаем руками и создадим InfoGAN для создания цифр MNIST для конкретных функций! Как видно из изображения выше, InfoGAN содержит три модели: генератор (G), дискриминатор (D) и вспомогательную модель (Q). Вход генератора включает три части: вектор шума размера 62, категориальный вектор размера 10 (представляющий 10 цифр) и непрерывный вектор размера 1. Вектор шума генерируется посредством нормального распределения, категориальный вектор является генератором. путем выбора целого числа от 0 до 9, а непрерывный вектор создается путем выбора значения с плавающей запятой от -1 до 1.

Генератор в InfoGAN имеет точно такую ​​же структуру, что и генератор в обычном GAN. Во-первых, он содержит два полностью связанных слоя, чтобы расширить входную форму до 6272 единиц. Затем 6272 единицы преобразованы в 128 слоев 7x7. После этого измененные слои обрабатываются тремя транспонированно-сверточными слоями, чтобы сформировать окончательное изображение размером 28x28 пикселей (если вы не знакомы с транспонированно-сверточным слоем, у меня есть статья, объясняющая это).

Дискриминатор также такой же, как и в обычных сетях GAN. Он содержит два сверточных слоя и два полносвязных слоя. Последний полностью связанный слой генерирует выходной сигнал с функцией активации «сигмоида» для представления реальных изображений (1) или поддельных изображений (0).

Вспомогательная модель разделяет все слои дискриминатора, за исключением последнего полностью подключенного слоя, и поэтому эти две модели определяются вместе. Вспомогательная модель имеет два дополнительных полносвязных слоя для идентификации дополнительной информации. Поскольку у нас есть два дополнительных входа для нашего генератора (категориальный вектор и непрерывный вектор), нам также необходимо иметь два разных выхода из вспомогательной модели. Таким образом, я установил один полносвязный слой с функцией активации softmax для определения категориального вывода, два полносвязных слоя для представления «mu» (среднее значение) и «сигма» (стандартное отклонение) гауссовского распределения:

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

После определения трех моделей мы можем построить нашу сеть InfoGAN! Я использовал Keras для построения сети:

Я знаю, что это довольно длинный код, поэтому давайте рассмотрим его шаг за шагом:

  • InfoGAN_Continuous - это класс модели Keras, который следует инициализировать, задав дискриминатор, генератор, вспомогательную модель, размер вектора шума и количество классов для категориального вектора.
  • Функция compile компилирует модель InfoGAN_Continuous (для всех трех оптимизаторов я использовал Adam).
  • create_gen_input - это функция, которую мы определили ранее для генерации входных данных для генератора.
  • concat_inputs объединяет три входных вектора (размер 62, размер 10, размер 1) в один вектор размером 73.
  • Функция train_step определяет шаг обучения. Требуются только партии реальных изображений. Сначала дискриминатор обучается путем различения половинной партии реальных изображений и половинной партии поддельных изображений. Потеря дискриминатора - это сумма потерь от различения реальных и поддельных изображений. Веса обновляются алгоритмом градиентного спуска на основе потерь. Затем генератор и вспомогательная модель обучаются с использованием полных пакетов поддельных изображений. Потеря вспомогательной модели содержит категориальную потерю и непрерывную потерю. Категориальная потеря - это просто категориальная перекрестная энтропия между предсказанной меткой и входным категориальным вектором; непрерывные потери - это функция плотности отрицательной логарифмической плотности распределения Гаусса для непрерывного векторного ввода. Минимизация отрицательной логарифмической функции плотности вероятности - это то же самое, что максимизация вероятности того, что наши непрерывные векторы лежат внутри предсказанного гауссовского распределения, и это то, что мы хотим. Потери генератора содержат как потери дискриминатора, так и потери вспомогательной модели. Поступая так, генератор научится создавать более реалистичные изображения с более конкретными функциями. Обратите внимание, что мы установили переменные в дискриминаторе как не обучаемые, поскольку мы не хотим изменять нейроны в дискриминаторе при обучении генератора и вспомогательной модели.

Теперь вам просто нужно обучить его с помощью нескольких строк кода !!!

Полученные результаты

Теперь давайте посмотрим на очень интересные результаты, которые я получил от модели InfoGAN!

Варьирующийся категориальный вектор

Во-первых, если вы измените категориальный векторный ввод, вы можете сгенерировать другие числа. Однако модель не знает, что метка 0 соответствует номеру 0! Он знает только, что разные метки соответствуют разным числам (поверьте мне, я каким-то образом потратил целый день, чтобы осознать это. Я всегда думал, что я потерпел неудачу, когда кормление метки 0 генерирует для меня число 9).

Так что вы можете переставить метки:

Изменяющийся непрерывный вектор

Изменяющийся непрерывный вектор может генерировать одно и то же число с разными формами. Например, для числа 1 число вращается по часовой стрелке при увеличении значения непрерывного вектора. Обратите внимание, что даже несмотря на то, что мы обучили модель, используя значения от -1 до 1, введя -1,5 и 1,5, мы все равно можем получить значимые результаты!

Обратите внимание, что надписи не такие, как на приведенных выше. Это потому, что я снова обучил модель, и модель всегда коррелирует метки с числами случайным образом.

Номер 5 более интересен. Кажется, что модель пытается повернуть число, но из-за своей более сложной формы число срезано.

Увеличение веса для постоянной потери

Вы можете заметить, что я установил отношение 0,1 к непрерывным потерям, как при добавлении его к общим потерям генератора, так и к общим вспомогательным потерям. Это сделано для того, чтобы модель не запуталась. Если непрерывный убыток имеет такое же соотношение, как и категориальный убыток (т.е. близко к 1), то модель будет рассматривать его как еще один фактор для определения типа чисел. Например, изображения ниже генерируются, когда я использую соотношение 0,5:

Как видите, хотя я использую ту же метку, меняя значение непрерывного вектора, число постепенно менялось от 2 до 4 или от 2 до 8! Это также означает, что компьютер действительно может находить сходство между числом 2 и числом 4 и числом 2 и числом 8 и знает, как преобразовать одно в другое. Разве это не потрясающе?

Заключение

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

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

Си Чен, Ян Зуан, Рейн Хаутхофт, Джон Шульман, Илья Суцкевер и Питер Аббил, InfoGAN: обучение интерпретируемому представлению с помощью информации, максимизирующей генеративные состязательные сети (2016), Корнельский университет