首页 > 解决方案 > 如何从 GAN 训练生成器?

问题描述

在阅读了 GAN 教程和代码示例后,我仍然不明白生成器是如何训练的。假设我们有一个简单的例子: - 生成器输入是噪声,输出是灰度图像 10x10 - 鉴别器输入是图像 10x10,输出是从 0 到 1 的单个值(假或真)

训练判别器很容易 - 将其输出视为真实并期望为 1。取假输出并期望为 0。我们在这里使用实际输出大小 - 单值。

但是训练生成器是不同的——我们采用假输出(1 个值)并将其作为预期输出。但这听起来更像是再次训练鉴别器。生成器的输出是图像 10x10 我们如何只用 1 个单值训练它?在这种情况下,反向传播如何工作?

标签: tensorflowkerasneural-networkdeep-learninggenerative-adversarial-network

解决方案


要训​​练生成器,您必须在整个组合模型中进行反向传播,同时冻结鉴别器的权重,以便只更新生成器。

为此,我们必须计算d(g(z; θg); θd),其中 θg 和 θd 是生成器和判别器的权重。为了更新生成器,我们可以计算梯度 wrt。仅 θ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)

推荐阅读