Плохой результат с пакетной нормализацией - PullRequest
1 голос
/ 14 октября 2019

Я пытался внедрить DCGan , документ для фейсбука, и был заблокирован двумя нижеуказанными проблемами почти 2 недели. Мы ценим любые предложения. Спасибо.

Выпуск 1:

В статье DCGAN предлагается использовать BN (нормализация партии) как генератор, так и дискриминатор. Но я не мог получить лучший результат с BN, чем без BN.

Я скопировал используемую модель DCGAN, которая точно такая же, как и для бумаги DCGAN. Я не думаю, что это связано с переоснащением. Потому что (1) он продолжает показывать тот же шум с исходной шумовой картиной и, кажется, никогда не был обучен. (2) Значение Loss очень стабильно, так что gan и дискриминатор на самом деле не изменены. (Он остается на уровне 0,6 ~ 0,7 и никогда не ощущается или поднимается, как при обрушении обеих моделей.) Если я проверяю только функцию потерь, кажется, что она хорошо обучается.

Проблема 2:

Когда я использовал float16, он всегда дает мне Нэн с моделью ниже. Я изменил эпсилон как 1e-4 1e-3, но не получилось. И вот еще один вопрос. Если я не использую BatchNormalization, это может быть Nan. это достаточно имеет смысл, я могу получить это. Но, если я использую BatchNormalization, он нормализуется в каждом слое. Даже если результат станет очень большим или очень маленьким, в каждом слое будет нормализована партия, что результат будет почти центрирован, и исчезновение не должно произойти. не так ли? это на самом деле моя мысль, но я не знаю, что я не так думаю .. пожалуйста, кто-нибудь, помогите мне.

===== Генератор =====

Input # (Нет, 128) <= скрытый </p>

Плотный # (Нет, 16384)
Нормализация партии
LeakyReLU

Изменение формы # (Нет, 4, 4, 1024)

Conv2DTranspose # (Нет, 4, 4, 512)

Пакетная нормализация
LeakyReLU

Conv2DTranspose # (Нет, 8, 8, 256)

Пакетная нормализация
LeakyReLU

Conv2DTranspose # (None, 16, 16, 128)

BatchNormalization
LeakyReLU

Conv2DTranspose # (None, 32, 32, 64)

Нормализация партии
LeakyReLU

Conv2DTranspose # (Нет, 64, 64, 32)

Нормализация партии
LeakyReLU

Conv2DTranspose # (Нет, 128, 128,16)

Пакетная нормализация
LeakyReLU

Conv2D # (Нет, 128, 128, 3)

===== Дискриминатор =====

Conv2D # (Нет, 128, 128, 3) LeakyReLU

Conv2D # (Нет, 64, 64, 16) Нормализация партии
Выпадение
LeakyReLU

Conv2D # (Нет, 32, 32, 32)
Нормализация партии
Dropout
LeakyReLU

Conv2D # (None, 16, 16, 64)
Пакетная нормализация
Dropout
LeakyReLU

Conv2D # (None, 8, 8, 128)
Пакетная нормализация
Выпадение
LeakyReLU

Conv2D # (Нет, 4, 4, 256)
Пакетная нормализация
Выпадение
LeakyReLU

Conv2D #(Нет, 2, 2, 512)
Нормализация партии
Выпадение
LeakyReLU

Уплощение
Выпадение
Плотный

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

image_shape => (128, 128, 3)
latent_dim => 128
channels => 3
iterations => 10000
batch_size => 128
epsilon => 0.005
weight_init_stddev => 0.02
beta_1 => 0.5
discriminator_lr => 0.0002
gan_lr => 0.0002

Ответы [ 2 ]

0 голосов
/ 17 октября 2019

Как мы знаем, псевдокод обучения пакетной нормализации

moving_mean = None;
moving_variance = None;

if not moving_mean:
  moving_mean = current_batch_mean
else:
  moving_mean = moving_mean * momentum + current_batch_mean * (1-momentum)

if not moving_variance:
  moving_variance = current_batch_variance
else:
  moving_variance = moving_variance * momentum + current_batch_variance * (1-momentum)

, и в этом суть.

Тензор потока по умолчанию для tenorflow и keras равен 0,99, что, если вы используете его без изменений, следующее значение обновления не повлияет на новое обновленное значение. в случае с pytorch импульс по умолчанию равен 0,1, что соответствует 0,9 в тензорном потоке или кератах.

С измененным значением импульса я получил улучшенный результат.

, если кто-то перенес симптомыкак я, попробуйте уменьшить значение импульса.

Спасибо.

0 голосов
/ 14 октября 2019

Я не знаю подробностей тезиса DCGAN , но если я изучу его, я найду приведенные ниже рекомендации по созданию стабильного DCGAN. Почему вы использовали LeakyReLU в Генераторе вместо ReLU?

Рекомендации по архитектуре для стабильных Deep Convolutional GAN ​​

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