3 слова. 11 слогов. Генеративно-состязательные сети.

Возможно, вы уже слышали об этом термине. Он распространяется со скоростью лесного пожара среди энтузиастов машинного обучения, особенно в графическом отделе. Такие компании, как NVIDIA, работают над этой относительно новой технологией, которая была представлена ​​в 2014 году исследователями из Монреальского университета.

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

У GAN такой большой потенциал, и мы только касаемся его поверхности.

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

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

Генерация рукописных цифр с использованием GAN

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

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

Затем мы можем объявить наш оптимизатор. Мы будем использовать оптимизатор Adam от Keras с этими конкретными параметрами.

Затем мы можем собрать модель генератора. Он состоит из 4 плотных слоев и 3 слоев Leaky ReLU. Входное измерение — это объявленная нами ранее переменная со значением 100. Генератор будет генерировать изображения, используя это значение измерения. Последний слой использует активацию «tanh» (которая в основном используется в классификации 2 классов), и вся модель компилируется с оптимизатором и функцией потерь «binary_crossentropy». Мы используем эту функцию потерь, потому что она измеряет производительность модели классификации, выходом которой является значение вероятности от 0 до 1.

Затем мы создаем модель дискриминатора, которая будет определять, являются ли переданные ей изображения подлинными (из набора данных MNIST) или нет (из генератора). Дискриминатор — это то, что со временем улучшает изображения, генерируемые генератором. Дискриминатор состоит из 4 плотных слоев, 3 слоев Leaky ReLU и 3 выпадающих слоев (для предотвращения переобучения). Последний плотный слой имеет функцию активации «сигмоид», которая используется для моделей, которые должны предсказывать вероятность как результат. Компилируем дискриминатор так же, как и генератор.

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

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

Наконец, мы можем обучить модель GAN, используя эту функцию обучения. Мы загружаем обучающие и тестовые данные, разделяем пакеты на 128 размеров, затем строим сеть GAN, используя функцию, которую мы создали ранее. Затем в цикле мы можем выполнять определенный набор задач в эпоху. Сначала мы создаем поддельные изображения MNIST, затем маркируем сгенерированные и поддельные данные, обучаем дискриминатор, обучаем генератор и, наконец, наносим изображения.

Результаты

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

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

Если вы хотите увидеть полный блокнот Colab, в котором я это закодировал, вот он!

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

Свяжись со мной!

Твиттер

ЛинкедИн

"Середина"

"Новостная рассылка"