Если бы вы были немного активны в сообществе машинного обучения, вы бы уже слышали о GANS (генеративные состязательные сети).

Что такое GANS?

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

Рассмотрим отношения между фальсификатором и следователем.

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

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

Это состязание фальсификатора против сыщика продолжается, что в конечном итоге делает сыщиков мирового класса (и, к сожалению, фальсификаторами мирового класса).

Теперь вы можете задаться вопросом, как это связано с GANS? хорошо GANS работают аналогичным образом, где Генератор (подделка) берет на себя задачу создания поддельных данных (изображений), тогда как Дискриминатор (исследователь) берет на себя задачу обзора данные и удаление поддельных, а также предоставление необходимой обратной связи Генератору для создания лучших изображений.

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

Давайте попробуем узнать о технических особенностях, пытаясь реализовать базовый DCGANS (Deep Convolutional GANS)

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

Внедрение DCGAN

Теперь попробуем реализовать DCGAN с использованием mnist_dataset.

Импорт библиотек

Мы будем использовать Tensorflow 2.0 для реализации DCGAN, мы будем использовать следующие уровни: Dense, Conv2D и Conv2DTranspose. Мы будем использовать RMSprop в качестве оптимизатора модели, а для построения графиков я использовал библиотеку matplotlib.

Генератор нейронной сети

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

В приведенной выше сети Generator сначала мы изменяем форму данных, а в фильтрах [128,64,32,1] мы добавляем шаги, затем мы используем Conv2DTranspose для преобразования его в вывод изображения и возврата Модель генератора.

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

Теперь давайте попробуем построить дискриминаторную часть модели, которая действует как исследователь, она пометит реальные изображения как 1.0, а поддельные изображения, сгенерированные нейронной сетью Generator, как 0.0. В этой модели используется функция активации сигмоида для различения реальных и поддельных изображений.

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

Обучите модель GAN

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

Не забудьте стабилизировать GAN и убедиться, что Генератор чему-то учится, Дискриминатор должен быть более мощным (обученным), чем Генератор, только тогда он сможет отправлять ценную обратную связь Генератору, из которого он может учиться и создавать лучшие поддельные изображения

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

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

Постройте изображения генератора

Теперь давайте создадим функцию, которая отображает созданные изображения и сохраняет их каждые 500 временных шагов.

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

Сборка и обучение моделей

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

Мы загружаем Mnist_dataset, затем сначала обучаем часть модели Discriminator (как я уже упоминал выше для стабильности и прогресса модели DCGAN), затем мы берем шум для генерации изображений из генератора.

Состязательная сеть = Генератор + Дискриминатор, при обучении Состязательной сети мы замораживаем веса Дискриминатора, после этого мы компилируем Состязательную сеть, в которой мы использовали binary_crossentropy в качестве функции потерь. .

Запустите DCGAN

Теперь запустим модель

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

Вот результат, который я получил во время тренировки mnist DCGANS

Конец (по крайней мере, пока)

Вы можете найти код для блога здесь

PS: если у вас есть какие-либо сомнения, вы можете написать мне здесь ([email protected]), вы можете связаться со мной по моему linkedin из здесь, и вы можете посмотрите другие мои коды (там есть действительно крутые штуки) на моем Github из здесь

Я также ищу возможности для фриланса в области глубокого обучения и компьютерного зрения, если вы готовы сотрудничать, напишите мне сюда ([email protected])

Удачного дня!