Как тренировать генератор из ГАН? - PullRequest
1 голос
/ 11 мая 2019

После прочтения учебников GAN и примеров кода я все еще не понимаю, как обучается генератор. Допустим, у нас есть простой случай: - на входе генератора шум, а на выходе - изображение в градациях серого 10x10 - вход дискриминатора - изображение 10x10, а выход - одно значение от 0 до 1 (ложное или истинное)

Обучить дискриминатор несложно - берите его вывод по-настоящему и ожидайте 1 за него. Возьмите выходные данные для подделки и ожидайте 0. Мы работаем с реальным размером вывода здесь - одно значение.

Но обучающий генератор другой - мы принимаем фальшивый результат (1 значение) и делаем ожидаемый результат для него как один. Но это больше похоже на тренировку дескриптора. Выход генератора - изображение 10х10, как мы можем обучить его только одному значению? Как обратное распространение может работать в этом случае?

Ответы [ 2 ]

2 голосов
/ 11 мая 2019

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

Для этого нам нужно вычислить d(g(z; θg); θd),где θg и θd - веса генератора и дискриминатора.Чтобы обновить генератор, мы можем вычислить градиент относительно.до θg только ∂loss(d(g(z; θg); θd)) / ∂θg, а затем обновите θg с использованием нормального градиентного спуска.

В Keras это может выглядеть примерно так (при использовании функционального API):

genInput = Input(input_shape)
discriminator = ...
generator = ...

discriminator.trainable = True
discriminator.compile(...)

discriminator.trainable = False
combined = Model(genInput, discriminator(generator(genInput)))
combined.compile(...)

При установке значения trainable в False уже скомпилированные модели не затрагиваются, только модели, скомпилированные вбудущее заморожено.Таким образом, дискриминатор может быть обучен как отдельная модель, но заморожен в комбинированной модели.

Затем, чтобы обучить вашу GAN:

X_real = ...
noise = ...
X_gen = generator.predict(noise)

# This will only train the discriminator
loss_real = discriminator.train_on_batch(X_real, one_out)
loss_fake = discriminator.train_on_batch(X_gen, zero_out)

d_loss = 0.5 * np.add(loss_real, loss_fake)

noise = ...
# This will only train the generator.
g_loss = self.combined.train_on_batch(noise, one_out)
0 голосов
/ 04 июня 2019

Я думаю, что лучший способ понять процедуру обучения Генератора - это пересмотреть весь цикл обучения.

Для каждой эпохи:

  1. Обновление Дискриминатор:

    • мини-пакетный проход реальных изображений через дискриминатор;

    • вычисление потерь дискриминатора и вычисление градиентов для обратного прохода;

    • создание мини-партии поддельных изображений через Генератор;

    • проход через мини-серию поддельных изображений через дискриминатор;

    • вычислить потери Дискриминатора и вывести градиенты для обратного прохода;

    • add (реальные мини-пакетные градиенты, поддельные мини-пакетные градиенты)

    • обновите Дискриминатор (используйте Адама или SGD).

  2. Обновление генератора:

    • переверните цели: получаются поддельные изображенияпомечены как реальные для генератора.Примечание: этот шаг обеспечивает использование минимизации кросс-энтропии для генератора.Это поможет преодолеть проблему исчезающих градиентов генератора, если мы продолжим реализацию игры GAN minmax.

    • мини-пакетная пересылка поддельных изображений через обновленный дискриминатор;

    • вычислить потери генератора на основе обновленного выходного сигнала дискриминатора, например:

    функция потерь (вероятность того, что поддельное изображение реально оценивается Discriminator, 1).
    Примечание: здесь 1 представляет ярлык генератора для поддельных изображений как реальный.

    • обновить генератор (используйте Адама или SGD)

Надеюсь, это поможет,Как видно из процедуры обучения, игроки GAN несколько «сотрудничают» в том смысле, что дискриминатор оценивает отношение данных к плотностям распределения модели и затем свободно делится этой информацией с генератором. С этой точки зрения дискриминаторбольше похоже на то, как учитель инструктирует генератор, как лучше, чем противник »(цитата из I.Goodfellow tutorial ).

...