GAN были введены Яном Гудфеллоу и соавт. в 2014 году. Янн ЛеКун назвал состязательную тренировку самой крутой вещью после нарезки хлеба. GAN - это нейронные сети, которые генерируют синтетические данные при определенных входных данных. Например, GAN можно научить генерировать изображения из текста. Генеративные состязательные сети состоят из двух моделей; генеративная и дискриминационная.

Дискриминационная модель

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

Генеративная модель

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

Как работают сети GAN

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

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

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

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

Различные типы GAN

Глубокие сверточные сети GAN (DCGAN)

DCGAN - это усовершенствованная версия GAN. Они более стабильны и генерируют изображения более высокого качества. В DCGAN пакетная нормализация выполняется в обеих сетях, то есть в сети генератора и сети дискриминатора. Их можно использовать для передачи стиля. Например, вы можете использовать набор данных сумок для создания обуви в том же стиле, что и сумки.

Условные сети GAN (cGAN)

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

StackGAN

Авторы статьи предлагают решение проблемы синтеза качественных изображений из текстовых описаний в компьютерном зрении. Они предлагают Stacked Generative Adversarial Networks (StackGAN) для создания фотореалистичных изображений 256x256 на основе текстовых описаний. Они разбивают сложную проблему на более решаемые подзадачи посредством процесса уточнения эскиза.

GAN этапа I рисует примитивную форму и цвета объекта на основе заданного текстового описания, в результате чего получаются изображения с низким разрешением на этапе I. GAN этапа II принимает результаты этапа I и текстовые описания в качестве входных данных и генерирует изображения высокого разрешения с фотореалистичными деталями.

InfoGAN

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

Сети Вассерштайна (WGAN)

WGAN изменяют функцию потерь, чтобы включить расстояние Вассерштейна. У них есть функции потерь, которые коррелируют с качеством изображения.

Откройте для себя междоменные отношения с генерирующими враждебными сетями (Disco GANS)

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

Существует еще много типов GAN, но мы не сможем охватить их все в этой статье. Перейдем к практическому применению сетей GAN.

Приложения GAN

  • Предсказание следующего кадра в видео

  • Увеличение разрешения изображения

В GAN можно подавать изображения с низким разрешением и создавать изображения с высоким разрешением.

  • Генерация текста в изображение

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

  • Преобразование изображения в изображение

Вы можете передать эскизы изображений в GAN, и они смогут сгенерировать реальное изображение.

Создание простой GAN в Керасе

Теперь, когда у нас есть правильное понимание GAN, давайте поработаем руками, написав простую GAN в Keras, которая будет генерировать цифры.

Мы начинаем с импорта Keras для построения модели и Matplotlib для построения цифр.

Затем нам нужно импортировать несколько пакетов, которые мы будем использовать для построения нашей GAN:

  • Входные данные, используемые для создания тензора Кераса.
  • Последовательная инициализация нейронной сети
  • Плотный для добавления большего количества слоев
  • LeakyReLU Утечка версии выпрямленного линейного блока.
  • набор данных MNIST
  • Оптимизатор Адама
  • Инициализаторы для определения способа установки начальных случайных весов слоев Keras.
  • Tqdm, пакет, позволяющий визуализировать процесс обучения с помощью индикатора выполнения.

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

Мы будем использовать популярный набор данных MNIST, который содержит изображения цифр от 0 до 9. Он имеет обучающий набор из 60 000 примеров и тестовый набор из 10 000 примеров.

Этот набор данных доступен с Keras и может быть импортирован как mnist.load_data() .

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

Теперь создадим генераторную и дискриминаторную сети. Мы используем оптимизатор Adam в обеих сетях. lr - это скорость обучения, а beta_1 находится между 0 и 1, но обычно устанавливается ближе к 1.

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

AttributeError: module ‘tensorflow.python.ops.nn’ has no attribute ‘leaky_relu’

Мы устанавливаем input_dim равным 784, потому что наш обучающий набор составляет 6000 на 784. Мы устанавливаем инициализатор ядра как RandomNormal ,, который генерирует тензоры с нормальным распределением. Мы передаем параметр stddev, который является скаляром Python и представляет стандартное отклонение генерируемых случайных значений. Мы также добавляем выпадающие слои , чтобы избежать переобучения.

Таким же образом настраиваем слой дискриминатора.

Теперь, когда у нас есть дискриминатор и генератор, нам нужно их объединить. Поскольку мы хотим обучать по одной сети за раз, мы устанавливаем обучаемость False. Затем мы объявляем переменную ganInput , которая примет случайное измерение, объявленное ранее.

Затем мы объявляем вывод генератора, который будет изображением. Затем мы получаем результат дискриминатора, который представляет собой вероятность того, что изображение является реальным или нет. Поскольку это двоичная классификация, мы используем функцию потерь binary_crossentropy .

Следующим шагом будет создание стены из сгенерированных изображений. Мы можем сделать это с помощью Matplotlib и объявив функцию. Поскольку мы преобразовали входные данные в 3D, нам также необходимо преобразовать сгенерированные изображения в 3D.

Затем мы определяем функцию для обучения и создания изображений. Эта функция будет делать несколько вещей:

  • Получите данные обучения и тестирования, загрузив их из Keras
  • Разделите данные на ванны размером 128
  • Используйте tqdm , чтобы показать прогресс обучения
  • Получить случайный набор входных изображений
  • Создавайте поддельные изображения MNIST
  • Обучить дискриминатор
  • Обучить генератор
  • Постройте сгенерированные изображения

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

Вот пример вывода, полученного после прохождения одной эпохи.

А вот пример вывода после 25 эпох. Тот, у которого больше эпох, намного яснее. Чем больше эпох вы выберете, тем дольше будет работать ваша модель. Больше эпох также требует большей вычислительной мощности.

Заключение

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



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

Независимая редакция, Heartbeat спонсируется и публикуется Comet, платформой MLOps, которая позволяет специалистам по обработке данных и группам машинного обучения отслеживать, сравнивать, объяснять и оптимизировать свои эксперименты. Мы платим участникам и не продаем рекламу.

Если вы хотите внести свой вклад, отправляйтесь на наш призыв к участникам. Вы также можете подписаться на наши еженедельные информационные бюллетени (Deep Learning Weekly и Comet Newsletter), присоединиться к нам в » «Slack и подписаться на Comet в Twitter и LinkedIn для получения ресурсов, событий и гораздо больше, что поможет вам быстрее и лучше строить лучшие модели машинного обучения.