【问题标题】:Difference between WGAN and WGAN-GP (Gradient Penalty)WGAN 和 WGAN-GP 的区别(梯度惩罚)
【发布时间】:2021-11-17 00:21:39
【问题描述】:

我只是在这里的代码中找到了:

https://github.com/NUS-Tim/Pytorch-WGAN/tree/master/models

对于 WGAN,WGAN 和 WGAN-GP 之间的“生成器”损失 G 是不同的:

g_loss = self.D(fake_images)
g_loss = g_loss.mean().mean(0).view(1)
g_loss.backward(one) # !!!
g_cost = -g_loss

但对于 WGAN-GP:

g_loss = self.D(fake_images)
g_loss = g_loss.mean()
g_loss.backward(mone) # !!!
g_cost = -g_loss

为什么一个是one=1 而另一个是mone=-1

【问题讨论】:

  • 我认为代码是错误的,正如你所说,WGAN和WGAN-GP的baseloss没有区别。顺便说一句,你可能会忽略火车 D 也是倒车的。

标签: deep-learning neural-network pytorch backpropagation generative-adversarial-network


【解决方案1】:

为了更新 D 网络: lossD = D(假数据)的期望 - D(真实数据)的期望 + 梯度惩罚 lossD ↓,D(真实数据) ↑

所以你需要在梯度过程中加减一

【讨论】:

  • 对于你需要的 WGAN 从上面的 Loss 看它
  • 正如目前所写,您的答案尚不清楚。请edit 添加其他详细信息,以帮助其他人了解这如何解决所提出的问题。你可以找到更多关于如何写好答案的信息in the help center
【解决方案2】:

您可能误读了源代码,您给出的第一个示例不是对D 的结果进行平均来计算其损失,而是使用二进制交叉熵。

更准确地说:

  • 第一种方法(“GAN”)使用 BCE 损失来计算 DG 的损失项。 D 的标准 GAN 优化目标是最小化 E_x[log(D(x))] + E_z[log(1-D(G(z)))]
    Source code:

    outputs = self.D(images)
    d_loss_real = self.loss(outputs.flatten(), real_labels) # <- bce loss
    real_score = outputs
    
    # Compute BCELoss using fake images
    fake_images = self.G(z)
    outputs = self.D(fake_images)
    d_loss_fake = self.loss(outputs.flatten(), fake_labels) # <- bce loss
    fake_score = outputs
    
    # Optimizie discriminator
    d_loss = d_loss_real + d_loss_fake
    self.D.zero_grad()
    d_loss.backward()
    self.d_optimizer.step()
    

    对于d_loss_real,您优化为1s(输出被认为是真实),而d_loss_fake 优化为0s(输出被认为是 )。

  • 而第二个 ("WCGAN") 使用 Wasserstein 损失 (ref),由此我们最大化 D 损失:E_x[D(x)] - E_z[D(G(z))]
    Source code:

    # Train discriminator
    # WGAN - Training discriminator more iterations than generator
    # Train with real images
    d_loss_real = self.D(images)
    d_loss_real = d_loss_real.mean()
    d_loss_real.backward(mone)
    
    # Train with fake images
    z = self.get_torch_variable(torch.randn(self.batch_size, 100, 1, 1))
    
    fake_images = self.G(z)
    d_loss_fake = self.D(fake_images)
    d_loss_fake = d_loss_fake.mean()
    d_loss_fake.backward(one)
    
    # [...]
    
    Wasserstein_D = d_loss_real - d_loss_fake
    

    通过执行d_loss_real.backward(mone),您使用相反符号的梯度进行反向传播,这是一个梯度上升,您最终会最大化d_loss_real

【讨论】:

  • 谢谢你的回复,不过我好像没表达清楚,跟Original GAN没什么关系,只有WGAN和WGAN-GP,我给的两部分代码分别对应WGAN和WGAN -GP(Grain G),所以没有 BCE,只有真实的 - 假的和假的 - 原始论文中显示的真实......我只想确定,对于 WGAN 和 WGAN-GP,为什么其中之一训练G的时候一个用一个用mone......
猜你喜欢
  • 2022-06-11
  • 1970-01-01
  • 1970-01-01
  • 2019-07-10
  • 2019-04-28
  • 2021-11-04
  • 2023-04-11
  • 2022-01-16
  • 2020-07-18
相关资源
最近更新 更多