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

Мы реализуем знаменитую статью о Generative Adversarial Networks примерно в 100 строках кода.



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

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

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

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

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

Генератор также представляет собой простой многослойный персептрон.

Теперь, когда у нас есть две основные части (генератор и дискриминатор), мы можем объединить их в основной функции оптимизации для обучения сетей. Реализация очевидна из псевдокода статьи.

Обратите внимание, что объективные уравнения были переписаны в терминах потери бинарной кросс-энтропии. Это более безопасный способ реализовать потерю, так что нам не нужно беспокоиться о числовых нестабильностях, поскольку они обрабатываются реализацией двоичной кросс-энтропии в PyTorch.

Теперь, когда все готово, давайте потренируемся в течение 50 000 эпох на наборе данных MNIST:

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

Полный код доступен в следующем репозитории GitHub.

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

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

  • Генеративное глубокое обучение: обучение машин рисованию, письму, сочинению и игре: https://amzn.to/3xLG9Zh
  • Генеративный ИИ с Python и TensorFlow 2: создавайте изображения, текст и музыку с помощью VAE, GAN, LSTM, моделей Transformer: https://amzn.to/3g4Y9Ia

Уведомление: я рекомендую только те продукты, которые использую сам, и все высказанные здесь мнения являются моими собственными. Этот пост может содержать партнерские ссылки, которые предоставляются вам бесплатно, я могу получить небольшую комиссию.