在优化生成器时,判别器的梯度
作者: 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