Как ИИ может научиться создавать изображение кошек

1656656176 kak ii mozhet nauchitsya sozdavat izobrazhenie koshek

Томас Симонини

1*7wMCLJ-EbSeyQvFUb9zVbA
Пример кошек, сгенерированных нашим DCGAN

В 2014 году исследовательская работа Generative Adversarial Nets (GAN) Гудфеллоу и другие. стал прорывом в области генеративных моделей.

Сам ведущий исследователь Ян Лекун назвал соревновательные сети самой «крутой идеей машинного обучения за последние двадцать лет».

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

1*BRTW5OTSkeiseWOFcPgU4w
DCGAN во время обучения

Чтобы просмотреть полный рабочий код, посмотрите мой репозиторий Github. Это поможет, если у вас уже есть определенный опыт работы с Python, Deep Learning и Tensorflow, а также CNN (конволюционные нейронные сети).

Если вы новичок в Deep Learning, посмотрите эту замечательную серию статей:

Машинная учеба – это весело!
Самое простое в мире поступление в машинное обучениеmedium.com

Что такое DCGAN?

Deep Convolutional Generative Adverserial Networks (или DCGAN) – это архитектура глубокого обучения, которая генерирует результаты, подобные данным в учебном наборе.

Эта модель заменяет полностью связанные уровни модели генеративной соревновательной сети на слои свертки.

Чтобы объяснить, как работает DCGAN, воспользуемся метафора искусствоведа и фальшивомонетчика.

Фальшивомонетчик (он же генератор) пытается изготовить поддельные картины Ван Гога и выдать их за настоящие.

1*AsJFLppJC5ODgZdAXWQXMQ
Значок преступника, сделанный Roundicon из www.flaticon.com

С другой стороны, эксперт по искусству (он же «дискриминатор») пытается поймать фальшивомонетчика, используя свои знания о настоящих картинах Ван Гога.

1*nuRYU3fkM0bnXsSAxq1eZQ

Со временем искусствоведы все лучше обнаруживают поддельные картины, а фальшивомонетчик – их подделывает.

1*EqkCwfjKAK8sKG7lY9AnOQ

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

  • Генератор — это фальшивомонетчик, пытающийся создать вроде бы подлинные данные. Он не имеет представления о реальных данных, но учится корректироваться на основе отзывов другой модели.
  • Дискриминатор это инспектор, пытающийся определить, что такое фальшивые поддельные данные (путем сравнения их с подлинными данными), стараясь при этом не вызвать ошибочных срабатываний относительно подлинных данных. Исходные результаты этой модели будут служить обратному распространению генератора.
1*aXSejGMGtQyyzXAqA6MtEw
Иллюстрация DCGAN
  • Генератор принимает случайный вектор шума и генерирует изображение.
  • Это изображение подается в дискриминатор, сравнивающий обучающий набор со сгенерированным изображением.
  • Дискриминатор возвращает число от 0 (фальшивое изображение) до 1 (настоящее изображение).

Давайте создадим DCGAN!

Теперь мы готовы создать наш ИИ.

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

Входные данные

Здесь мы создаем заполнители входных данных: inputs_real для дискриминатора и inputs_z для генератора.

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

DCGAN очень чувствительны к гиперпараметрам, поэтому очень важно их точно настроить.

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

Мы используем tf.variable_scope по двум причинам.

Во-первых, мы хотим убедиться, что имена всех переменных начинаются с генератора/дискриминатора. Это поможет позже, когда мы научим две сети.

Во-вторых, мы хотим повторно использовать эти сети с разными входами:

  • Для генератора мы научим его, но также будем брать с него поддельные изображения после обучения.
  • Для дискриминатора: нам нужно разделить переменные между поддельными и подлинными входными изображениями.
1*rAg13RBdRqt02voSsCUshg
Дискриминатор

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

Некоторые технические замечания:

  • Принцип состоит в том, чтобы удвоить размер фильтра на каждом слое свертки.
  • Не рекомендуется использовать уменьшение дискретизации. Вместо этого мы используем только сверточные слои.
  • Мы используем пакетную нормализацию на каждом слое (кроме входного), поскольку она уменьшает ковариационный сдвиг. Чтобы узнать больше, просмотрите эту замечательную статью.
  • Мы используем Leaky ReLU в качестве функции активации, поскольку это помогает избежать эффекта исчезновения градиента.
1*5QXJKtkNguNqc9whAcHJbA

Затем создаем генератор. Помните, что он принимает в качестве входа случайный вектор шума (z) и выводит фальшивое изображение благодаря транспонированным слоям свертки.

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

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

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

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

Мы хотим, чтобы дискриминатор выводил 1, когда он «считает» изображение подлинным, и 0 для поддельных изображений. Поэтому нам нужно настроить ущерб, чтобы это отразить.

Потеря дискриминатора – это сумма потерь для реальных и поддельных изображений:

d_loss = d_loss_real + d_loss_fake 

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

  • использование d_logits_real и этикетки все равны 1 (поскольку все реальные данные реальны)
  • labels = tf.ones_like(tensor) * (1 - smooth) Мы используем сглаживание меток: это означает немного уменьшить метки с 1,0 до 0,9 чтобы помочь дискриминатору лучше обобщать.

d_loss_fake это потеря, когда дискриминатор предполагает, что изображение является подлинным, хотя на самом деле это было поддельное изображение.

  • использование d_logits_fakeи этикетки все 0.

Генератор потери снова использует d_logits_fake от дискриминатора. На этот раз все метки 1, потому что генератор хочет обмануть дискриминатор.

Оптимизаторы

После расчета потерь нам нужно отдельно обновить генератор и дискриминатор.

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

Обучение

Здесь мы реализуем функцию обучения.

Идея относительно проста:

  • Мы сохраняем модель каждые пять эпох.
  • Мы сохраняем изображение в папке изображений каждые десять обученных партий.
  • Мы демонстрируем g_loss , d_loss и изображение, генерируемое каждые 15 эпох. Это по простой причине: блокнот Jupyter может выдавать ошибку, если отображается слишком много изображений.
  • Или мы можем напрямую создать реальные изображения, загрузив сохраненную модель (это сэкономит вам 20 часов обучения).

Как его запустить

Вы не можете запустить это на своем персональном компьютере – если у вас нет собственных графических процессоров или вы готовы ждать, возможно, 10 лет!

Вместо этого необходимо использовать облачные сервисы GPU, такие как AWS или FloydHub.

Лично я тренировал этот DCGAN в течение 20 часов с Microsoft Azure и их виртуальной машиной глубокого обучения.

Отказ от ответственности: у меня нет деловых отношений с Azure. Мне просто понравилось их отличное обслуживание клиентов!

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

На этом все я надеюсь, что этот учебник был полезен!

Если вы усовершенствовали модель, не стесняйтесь сделать запрос на получение.

0*hGcVJaw3kTvzCC3h

Если у вас есть мнения, комментарии, или хотите показать мне свои результаты, не стесняйтесь оставить комментарий ниже или отправить мне электронное письмо: hello@simoninithomas.com или написать мне в Twitter @ThomasSimonini.

И если вам понравилась моя статья, нажмите ? ниже, чтобы другие люди увидели это здесь на Medium. И не забудь следовать за мной!

здоровья!

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *