Реальная генеративно-состязательная сеть [3]: DCGAN

искусственный интеллект GitHub Нейронные сети Архитектура

В предыдущей статье "Генеративно-состязательные сети в действии [2]: Генерация рукописных цифр", мы использовали простую нейронную сеть для генерации рукописных цифр, и мы видим, что глифы рукописных цифр не идеальны, сгенерированные рукописные цифры немного грубы, а края недостаточно гладкие.

В генеративно-состязательных сетях генератор и дискриминатор являются врагами. Для повышения уровня генератора необходимо улучшить распознавающую способность дискриминатора. существует"Шаг за шагом повышайте скорость распознавания рукописных цифр(3)В серии статей мы обсудили, как повысить скорость распознавания рукописных цифр, и обнаружили, что сверточная нейронная сеть имеет большие преимущества при обработке изображений. Наконец, модель сверточной нейронной сети использовалась для достижения хорошей скорости распознавания. Естественно, для улучшения качества рукописных цифр, генерируемых генеративно-состязательными сетями, можно ли использовать и сверточные нейронные сети?

Ответ - да, но сШаг за шагом повышайте скорость распознавания рукописных цифр(3)«Недостаточно использовать структуру сверточной нейронной сети случайным образом, потому что в генеративно-состязательной сети есть две модели нейронной сети, противостоящие друг другу, и случайный выбор структуры сети легко вызывает колебания в итеративном процессе, и трудно сходиться.

К счастью, эксперты и ученые провели исследования в этой области.Вот статья, написанная совместно Алеком Рэдфордом, Люком Метцем и Сумитом Чинтала.arXiv: 1511.06434, «Неконтролируемое репрезентативное обучение с помощью глубоких сверточных генеративно-состязательных сетей».

В документе представлена ​​структура модели генератора, как показано на следующем рисунке:

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

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

Если вы используете keras для реализации вышеуказанной модели, это очень просто. Однако следует отметить, что окончательный результат генерации рукописных цифр, обсуждаемый в этой статье, представляет собой изображение в градациях серого 28 x 28 x 1, поэтому мы следуем приведенной выше архитектуре модели, но вносим некоторые коррективы в конкретную реализацию:

100x1 → 1024x1 → 128x7x7 → 128x14x14 → 14x14x64 → 28x28x64 → 8x28x1

код показывает, как показано ниже:

def generator_model():
  model = Sequential()
  model.add(Dense(input_dim=100, output_dim=1024))
  model.add(Activation('tanh'))
  model.add(Dense(128 * 7 * 7))
  model.add(BatchNormalization())
  model.add(Activation('tanh'))
  model.add(Reshape((7, 7, 128), input_shape=(128 * 7 * 7,)))
  model.add(UpSampling2D(size=(2, 2)))
  model.add(Conv2D(64, (5, 5), padding='same'))
  model.add(Activation('tanh'))
  model.add(UpSampling2D(size=(2, 2)))
  model.add(Conv2D(1, (5, 5), padding='same'))
  model.add(Activation('tanh'))
  return model

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

Реализация дискриминатора почти обратна приведенной выше модели генератора, но с использованием максимального пула вместо повышения частоты дискретизации код выглядит следующим образом:

def discriminator_model():
  model = Sequential()
  model.add(
      Conv2D(64, (5, 5),
             padding='same',
             input_shape=(28, 28, 1))
  )
  model.add(Activation('tanh'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Conv2D(128, (5, 5)))
  model.add(Activation('tanh'))
  model.add(MaxPooling2D(pool_size=(2, 2)))
  model.add(Flatten())
  model.add(Dense(1024))
  model.add(Activation('tanh'))
  model.add(Dense(1))
  model.add(Activation('sigmoid'))
  return model

В статье авторы предлагают укрепить сеть со следующими архитектурными ограничениями:

  • Используйте пошаговые свертки вместо объединения слоев в дискриминаторе и деконволюции в генераторе вместо объединения слоев.
  • Используйте пакетную регуляризацию в генераторе и дискриминаторе.
  • Устраните полностью связанные слои глубоко в архитектуре.
  • Tanh используется в выходном слое генератора, а активация ReLU используется во всех остальных слоях.
  • Активации LeakyReLU используются во всех слоях дискриминатора.

Вышеприведенный код не полностью соответствует предложениям автора, видно, что в условиях разных сценариев разработчики могут играть по-своему. На самом деле, в книге GANs in Action автор также дал другую модель DCGAN для рукописной генерации цифр, Код можно сослаться на:GitHub.com/Ган в действии…

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

Полный код содержимого, показанного в этой статье, см. по адресу:GitHub.com/mogo Web/голодание…

image