gpt4 book ai didi

tensorflow - 如何从 GAN 训练生成器?

转载 作者:行者123 更新时间:2023-12-05 03:01:14 25 4
gpt4 key购买 nike

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

训练鉴别器很简单 - 将其输出视为真实的并期望它为 1。将输出作为假值并期望为 0。我们在这里使用真实输出大小 - 单个值。

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

最佳答案

要训练生成器,您必须反向传播整个组合模型,同时卡住鉴别器的权重,以便仅更新生成器。

为此,我们必须计算 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,已经编译的模型不受影响,只会卡住 future 编译的模型。因此,判别器可作为独立模型进行训练,但在组合模型中卡住。

然后,训练您的 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)

关于tensorflow - 如何从 GAN 训练生成器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56092361/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com