在优化生成器时,判别器的梯度

作者: YoojLee创建于 2022年5月25日更新于 2024年10月30日

-----------------

训练生成器

-----------------

optimizer_G.zero_grad()

从噪声和标签中生成生成器输入

z = Variable(FloatTensor(np.random.normal(0, 1, (batch_size, opt.latent_dim)))) gen_labels = Variable(LongTensor(np.random.randint(0, opt.n_classes, batch_size)))

生成一批图像

gen_imgs = generator(z, gen_labels)

计算生成器欺骗判别器的能力的损失

validity = discriminator(gen_imgs, gen_labels) g_loss = adversarial_loss(validity, valid)

g_loss.backward() optimizer_G.step()

---------------------

训练判别器

---------------------

optimizer_D.zero_grad()

对真实图像的损失

validity_real = discriminator(real_imgs, labels) d_real_loss = adversarial_loss(validity_real, valid)

对伪图像的损失

validity_fake = discriminator(gen_imgs.detach(), gen_labels) d_fake_loss = adversarial_loss(validity_fake, fake)

在上述代码中,在优化 D 时,生成的图像被从计算图中分离,因为在优化 D 时,不应计算 G 的梯度。我相当确定,与优化 D 相同,在优化 G 时,判别器应与 G 独立(通过控制 D 中参数的 requires_grad 属性或其他方式)。

内容来源: eriklindernoren/PyTorch-GAN