Я тренирую сеть GAN от Keras в Tensorflow 2.0. Я могу получить некоторые разумные, но не очень хорошо выглядящие результаты, пока не попытаюсь добавить слои BatchNormalization.
Я знаю, что обучение GAN очень чувствительно со многими причинами, вызывающими расхождение, но я хочу знать, что происходит в этом случае. случай: потери дискриминатора / генератора снижаются до нуля.
Моя сеть похожа на обычные примеры DCGAN:
===== Generator =====
Input(128)
Dense(16384) => ReLU
Reshape(4 x 4 x 1024)
Conv2DTranspose(8 x 8 x 512, kernel=4, stride=2) => ReLU
Conv2DTranspose(16 x 16 x 256, kernel=4, stride=2) => ReLU
Conv2DTranspose(32 x 32 x 128, kernel=4, stride=2) => ReLU
Conv2DTranspose(64 x 64 x 3, kernel=4, stride=2, activation=sigmoid)
===== Discriminator =====
Conv2D(32 x 32 x 64, kernel=3, stride=2) => LeakyReLU(alpha=0.2)
Conv2D16 x 16 x 128, kernel=3, stride=2) => LeakyReLU(alpha=0.2)
Conv2D(8 x 8 x 256, kernel=3, stride=2) => LeakyReLU(alpha=0.2)
Conv2D(4 x 4 x 512, kernel=3, stride=2) => LeakyReLU(alpha=0.2)
Flatten(8192)
Dense(1, activation=sigmoid)
Я также следую предлагаемым настройкам обучения DCGAN:
Kernel init = RandomNormal, stddev=0.02
Optimizer = Adam, beta1 = 0.5
Learning rate = 0.0002
Мой набор данных содержит 2048 изображений с указанным классом.
С первой попытки я обучаю сеть в следующем порядке:
1. Нарисуйте 128 реальных выборок с небольшим пространственным увеличением.
2. Сгенерируйте 128 фальшивых выборок с помощью генератора тока.
3. Соберите сэмплы и обучите дискриминатор по этим 256 выборкам как пакет
4. Генерируйте 256 случайных векторов скрытых данных
5 . Обучите генератор по этим 256 векторам как пакет.
Значения потерь усредняются и сообщаются после каждой эпохи. * 102 2 *
Я получаю честные результаты из этих настроек. Потеря дискриминатора составляет 0,60-0,70, а потери генератора - 0,70-1,00, но улучшение качества, по-видимому, происходит медленно. Поэтому я добавляю уровень нормализации партии ко всем (транспонированным) сверткам, кроме одного на выходе генератора, как обычно предлагается.
После добавления нормализации партии потеря обучения становится значительно нестабильной, но не расходится напрямую. Потеря дискриминатора падает до 0,20-0,40, а потери генератора изменяются в пределах 1,00-3,00.
Я пробовал импульс = 0,8 или 0,9, и они дают аналогичное поведение.
Затем я пытаюсь НЕ складывать реальные / поддельные выборки в одну партию, а обучать дискриминатор по 128 реальным выборкам, затем 128 поддельным выборкам и все еще использовать слои нормализации партии.
Под этим При установке значения дискриминатор и потери генератора быстро уменьшаются после первой эпохи и приближаются к 0. Сгенерированные изображения выглядят как сильные цветовые шумы на каждом пикселе, и прогнозируемые вероятности (после сигмовидности) этих зашумленных изображений все близки к 1,0.
Если я удаляю все слои пакетной нормализации, а просто обучаю реальные / поддельные образцы отдельно, эта проблема не возникает.
Если генератор может обмануть дискриминатор зашумленными изображениями и получить высокую вероятность, почему потеря дискриминатора может все еще быть очень близко к нулю после его тренировки? Имеет ли плохой эффект уровень нормализации партии в этом сценарии?