GAN

Мы обучим нейросеть генерировать лица людей и посмотрим на то, как можно оценивать качество генерации. В качестве обучающей выборки возьмём датасет Flickr-Faces.

Задача

В этом проекте мы обучим нейросеть генерировать лица людей и посмотрим на то, как можно оценивать качество генерации. В качестве обучающей выборки возьмём датасет Flickr-Faces.

Мы будем работать с генеративно-состязательной сетью, которая состоит из двух отдельных нейросетей: генератора и дискриминатора. Генератор создаёт изображения (в нашем случае - фотографии людей), а дискриминатор пытается отличить их от правильных (настоящих) фотографий.

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

Ноутбук

(ноутбук проекта)

Выводы

В этом проекте мы обучали генеративно-состязательную нейросеть (GAN) создавать лица людей. В качестве обучающей выборки мы взяли датасет Flickr-Faces.

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

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

Для улучшения результатов мы применили несколько трюков: зашумляли изображения, подаваемые на вход дискриминатору, а также, вместо меток классов 0 и 1 использовали метки от 0.0 до 0.1 и от 0.9 до 1.0. Мы делали это для того, чтобы “усложнить жизнь” дискриминатору и дать генератору шанс обучиться.

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

Так как оценивать качество генерации визуально не всегда удобно, мы реализовали дополнительный критерий оценки следующим образом:

  • сгенерировали столько же изображений, сколько есть настоящих в обучающей выборке
  • сгенерированным изображениям присвоили метку класса 0, настоящим - 1
  • посчитали leave-one-out оценку: обучили классификатор (KNeighborsClassifier при n=1) предсказывать класс на всех объектах, кроме одного, а затем проверили качество (accuracy) на оставшемся объекте.

Суть данной проверки довольно проста: если сгенерированные фотографии сильно отличаются от настоящих, то классификатор будет легко различать их и значение метрики accuracy будет близко к 1. Если же сгенерированные фотографии очень правдоподобны, то классификатор будет часто ошибаться и значение accuracy будет близко к 0.5.

Нам удалось достичь значения метрики 0.846, то есть сгенерированные изображения всё же содержат существенные отличия от реальных, но и не совсем неправдоподобны, что совпадает с результатами визуального анализа.

Мы также реализовали дополнительную проверку результатов через визуализацию распределений. После снижения размерности изображений методом TSNE мы нанесли получившиеся точки на график. Такая визуализация показала, что часть точек реальных и сгенерированных изображений визуально разделимы и группируются в разные кластеры. Если бы наш генератор работал хорошо, то такого эффекта бы не было.