Tensorflow 如何从赣培训发电机?

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个单一值对其进行训练?反向传播在这种

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

训练鉴别器很简单-将其输出视为真实,期望为1。为fake获取输出,预期为0。我们正在处理实际的输出大小-单个值


但训练生成器是不同的-我们采用假输出(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)。
    注:此处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)