tensorflow - 如何从 GAN 训练生成器?
问题描述
在阅读了 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,已经编译的模型不受影响,只有将来编译的模型被冻结。因此,鉴别器可以作为独立模型进行训练,但在组合模型中冻结。
然后,训练你的 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)
推荐阅读
- javascript - Javascript - 将字符串转换为值
- java - JAVA - 如何检测验证中的第一个零
- sql - 具有聚合函数的 SQL 子查询 - 寻找替代方法
- javascript - 使这个函数同步?
- python-3.x - Alexa 访问令牌有效范围
- java - 使用 JSON-B / Yasson 将 JSON 反序列化为多态 POJO
- c++ - 从文件资源管理器中选择图像后将图像放在屏幕上
- google-analytics - 当数据 api 达到限制时,youtube 分析 api 返回 Daily Limit Exceeded 错误
- c++ - 如何使用矩形绘制粗线?
- c++ - 检查一个类是否有可能重载的函数调用运算符