Одна из самых интересных частей Generative Adversarial Networks - это дизайн сети Generator. Сеть генератора может принимать случайный шум и отображать его в изображения, чтобы дискриминатор не мог определить, какие изображения были получены из набора данных, а какие - из генератора.

Это очень интересное приложение нейронных сетей. Обычно нейронные сети сопоставляют входные данные с двоичным выходом (1 или 0), может быть, с выходом регрессии (некоторое действительное число) или даже с несколькими категориальными выходными данными (такими как MNIST или CIFAR-10/100).

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

Мы рассмотрим документ, представляющий DCGAN в ICLR, архитектуру сети генераторов, которая генерирует спальни, и мы рассмотрим некоторый код Python / Keras из репозитория GANs-in-Action.

Это генератор DCGAN, представленный в документе моделирования сцены LSUN. Эта сеть принимает вектор шума 100x1, обозначенный z, и отображает его в выходной сигнал G (Z), который имеет размер 64x64x3.

Эта архитектура особенно интересна тем, как первый слой расширяет случайный шум. Сеть идет от 100x1 до 1024x4x4! Этот слой называется «спроектировать и изменить».

Мы видим, что после этого слоя применяются классические сверточные слои, которые изменяют форму сети с помощью уравнения (N + P - F) / S + 1, которое классически преподается со сверточными слоями. На приведенной выше диаграмме мы видим, что параметр N (Высота / Ширина) изменяется от 4 до 8, от 16 до 32, не видно, что есть какие-либо отступы, параметр фильтра ядра F равен 5x5, а шаг равно 2. Это уравнение может оказаться полезным для разработки собственных сверточных слоев для настраиваемых выходных размеров.

Мы видим, что сеть идет от

100x1 → 1024x4x4 → 512x8x8 → 256x16x16 → 128x32x32 → 64x64x3

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

Теперь давайте посмотрим на код Python:

Этот код взят из репозитория gans-in-action, созданного Якубом Лангром и Владимиром Боком, из того, что я обнаружил, это лучший стартовый код для реализации GAN в Керасе. Я не думаю, что эта книга еще вышла, но думаю, она будет очень хорошей.



В приведенном ниже коде показано, как я запустил свою первую сеть GAN (не поддерживает DCGAN):

def generator(img_shape, z_dim):
  model = Sequential()
  # Hidden layer
  model.add(Dense(128, input_dim = z_dim))
  # Leaky ReLU
  model.add(LeakyReLU(alpha=0.01))
  # Output layer with tanh activation
  model.add(Dense(28*28*1, activation='tanh'))
  model.add(Reshape(img_shape)
  z = Input(shape=(z_dim,))
  img = model(z)
  return Model(z, img)

Представленная ниже архитектура не слишком сложна и действительно дает довольно приличные результаты на примере набора данных MNIST. Эта модель принимает вектор шума и отображает его на плотно связанный слой, который сопоставляется с выходным слоем, который представляет собой плоский вектор 784x1, преобразованный в цифровую матрицу MNIST 28x28.

Теперь давайте сравним это с кодом DCGAN, представленным в репозитории gans-in-action:

def generator(img_shape, z_dim):
  model = Sequential()
 
  # Reshape input into 7x7x256 tensor via a fully connected layer
  model.add(Dense(256*7*7, input_dim = z_dim))
  model.add(Reshape((7,7,256))
  # Transposed convolution layer, from 7x7x256 into 14x14x128 tensor
  model.add(Conv2DTranspose(
               128, kernel_size = 3, strides = 2, padding='same'))
  #Batch normalization
  model.add(BatchNormalization())
  #Leaky ReLU
  model.add(LeakyReLU(alpha=0.01))
  # Transposed convolution layer, from 14x14x128 to 14x14x64 tensor
  model.add(Conv2DTranspose(
              64, kernel_size=3, strides=1, padding='same'))
  # Batch normalization
  model.add(BatchNormalization())
  # Leaky ReLU
  model.add(LeakyReLU(alpha=0.01))
  # Transposed convolution layer, from 14x14x64 to 28x28x1 tensor
  model.add(Conv2DTranspose(
               1, kernel_size = 3, strides = 2, padding='same'))
  # Tanh activation
  model.add(Activation('tanh'))
  z = Input(shape=(z_dim,))
  img = model(z)
  return Model(z, img)

Мы видим, что архитектура выше очень похожа на DCGAN, представленную в ICLR, документе о генераторе сцены LSUN. Входной сигнал проецируется из шума 100x1 в тензор 7x7x256, который затем сворачивается до тех пор, пока вы не достигнете выходного значения 28x28x1 MNIST.

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

Заключение

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

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

CShorten

Коннор Шортен - студент факультета информатики Атлантического университета Флориды. Научные интересы в области компьютерного зрения, глубокого обучения и разработки программного обеспечения.