Tensorflow 如何从赣培训发电机?
在阅读了GAN教程和代码示例之后,我仍然不明白生成器是如何训练的。假设我们有一个简单的例子: -发电机输入为噪声,输出为灰度图像10x10 -鉴别器输入为图像10x10,输出为从0到1的单个值(假或真) 训练鉴别器很简单-将其输出视为真实,期望为1。为fake获取输出,预期为0。我们正在处理实际的输出大小-单个值Tensorflow 如何从赣培训发电机?,tensorflow,keras,neural-network,deep-learning,generative-adversarial-network,Tensorflow,Keras,Neural Network,Deep Learning,Generative Adversarial Network,在阅读了GAN教程和代码示例之后,我仍然不明白生成器是如何训练的。假设我们有一个简单的例子: -发电机输入为噪声,输出为灰度图像10x10 -鉴别器输入为图像10x10,输出为从0到1的单个值(假或真) 训练鉴别器很简单-将其输出视为真实,期望为1。为fake获取输出,预期为0。我们正在处理实际的输出大小-单个值 但训练生成器是不同的-我们采用假输出(1个值),并将其预期输出作为一个。但这听起来更像是对描述者的训练。发电机的输出为图像10x10,我们如何仅用1个单一值对其进行训练?反向传播在这种
但训练生成器是不同的-我们采用假输出(1个值),并将其预期输出作为一个。但这听起来更像是对描述者的训练。发电机的输出为图像10x10,我们如何仅用1个单一值对其进行训练?反向传播在这种情况下如何工作?要训练生成器,必须在冻结鉴别器权重的同时反向传播整个组合模型,以便仅更新生成器 为此,我们必须计算
d(g(z;θg);θd)
,其中θg和θd是生成器和鉴别器的权重。为了更新生成器,我们可以计算梯度wrt。仅对θg∂损耗(d(g(z;θg;θd))/∂θg
,然后使用法线梯度下降更新θg
在Keras中,这可能看起来像这样(使用函数API):
通过将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)
我想理解发电机培训程序的最好方法是修改所有培训循环 对于每个时代:
- 正向真实图像小批量通过鉴别器
- 计算鉴别器损耗,并计算反向过程的梯度
- 通过生成器生成伪图像小批量
- 通过鉴别器正向生成伪小批量传递
- 计算鉴别器损耗并导出反向过程的梯度
- 添加(真实小批量渐变、假小批量渐变)
- 更新鉴别器(使用Adam或SGD)
- 翻转目标:为生成器将假图像标记为真实图像。注意:此步骤确保对生成器使用交叉熵最小化。如果我们继续执行GAN-minmax博弈,它有助于克服生成器的消失梯度问题
- 通过更新的鉴别器转发伪图像
- 根据更新的鉴别器输出计算发电机损耗,例如:
注:此处1表示假图像的生成器标签为真
- 更新发电机(使用Adam或SGD)
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)