В предыдущей статье "Генеративно-состязательные сети в действии [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/голодание…