Вы знаете кого-нибудь здесь?

Вы когда-нибудь играли в эту видеоигру?

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

Правильно?

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

Что такое GAN и как он работает?

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

Как они работают?

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

Первая нейронная сеть GAN называется генератором. Учитывая случайный ввод, генератор изо всех сил пытается сгенерировать правдоподобный вывод.

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

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

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

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

Подробности

Чтобы улучшить сети, две сети должны стремиться максимизировать ценность. Таким образом, мы обучаем дискриминатор присваивать правильную метку как сгенерированным изображениям, так и реальным образцам. D(x) представляет вероятность того, что x получен из реального набора данных, а не из генератора. D(x), дающее значение 1, будет означать, что дискриминатор на 100 % уверен, что образец является реальным изображением. Чтобы максимизировать вероятность присвоения дискриминатором правильной метки как сгенерированным, так и реальным образцам, дискриминатор пытается максимизировать

Одновременно генератор обучается максимизировать log( D( G(z ) ) ),где z — входной шум. log( D( G(z ) ) )представляет классификация дискриминатора на выходе генератора.Чем выше число, тем больше дискриминатор считает, что выход генератора реален, и, следовательно, тем лучше работает генератор.

Как GAN так хорошо генерируют изображения?

Сверточные слои

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

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

Вместе сверточные слои и структура GAN объединяются для создания типа GAN, называемого глубокой сверточной генеративно-состязательной сетью или DCGAN.

Давайте создадим нашу собственную GAN для создания реалистичных человеческих глаз

Сбор данных

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

Мы загружаем изображения в 3 канала для RGB, затем изменяем их размер до 128x128. Я нашел это разрешение хорошим компромиссом между низким временем вычислений и высоким разрешением. Когда изображения загружаются, значение каждого пикселя представляет собой число с плавающей запятой от 0 до 255. Поскольку функция активации нашего генератора будет tanh, значения пикселя должны быть сопоставлены со значениями от -1 до 1 для соответствия.

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

После загрузки и дополнения изображений мы создаем набор данных TensorFlow в строке 23, перемешиваем изображения и разделяем их на пакеты. Я обучил модель с размером пакета 64, так как это был максимум, с которым мог справиться мой GPU. Окончательные изображения в наборе данных выглядят так.

Построение модели

Дискриминатор

Дискриминатор — это просто CNN. Добавлена ​​сигмовидная функция активации, чтобы поддерживать выходные значения между 0 и 1. Выход CNN 1 будет означать, что он на 100% уверен, что входное изображение является реальным глазом из набора данных.

Генератор

Генератор немного сложнее

Он действует почти как обратный CNN. Он принимает тензор случайного шума и применяет фильтры для его масштабирования до изображения размером 128x128. По мере обучения вес фильтров будет улучшаться для создания более качественных изображений.

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

Тензор формы 100 связан с плотным слоем размером 16*16*256. Это делается для того, чтобы размер слоя можно было изменить на 16, 16, 256. Другими словами, случайный шум преобразуется в изображение 16x16 с 256 каналами. Слои Conv2DTranspose уменьшают количество каналов, увеличивая размер вывода, пока, наконец, генератор не выводит изображение 128x128 с 3 каналами.

Потеря

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

Потери генератора

Генератор оптимизируется для создания выходных данных, которые дискриминатор классифицирует как 1 для изображения, похожего на данные обучения. Чтобы оптимизировать это, мы используем бинарную кросс-энтропийную потерю с y_true в качестве единицы и y_pred в качестве выходных данных дискриминатора при получении изображений от генератора в текущем обучении. шаг. Это фиксирует, насколько сгенерированные изображения близки к реальному изображению.

Потеря дискриминатора

В отличие от генератора, дискриминатор оптимизируется по двум параметрам на каждом этапе. Это точность сопоставления реальных обучающих данных с меткой 1 и сгенерированных выходных данных с меткой 0. Таким образом, потеря дискриминатора состоит из суммирования двух отдельных потерь. Как и потери генератора, используется бинарная кросс-энтропия.

Обучение

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

Результаты

400 эпох

Запускаем GAN на 400 эпох и получаем следующие результаты. Генератор узнал цвет кожи из набора данных и имеет общее представление о том, как выглядят глазницы и зрачки. Однако сгенерированные изображения по-прежнему размыты и имеют много артефактов.

Еще 400 эпох (всего 800 эпох)

После запуска GAN еще 400 эпох генератор лучше понимает текстуру и цвет кожи. Он начинает генерировать правильные глаза с хорошей формой зрачка и размытием. Разрешение изображений также улучшилось.

Еще 400 эпох (всего 1200 эпох)

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

Последние 400 эпох (всего 1600 эпох)

Наконец, после 1600 эпох генератор в основном способен генерировать высококачественные глаза с небольшими артефактами. Генератор не идеален, как показано на изображении с синей кожей, изображении без реального глаза и изображении с красным вместо глаза. В то же время генератор способен генерировать почти реалистичные глаза. Примечательно четвертый глаз в третьем столбце.

Полный код, а также данные для обучения можно найти на Github

Вывод

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