【发布时间】:2022-04-17 14:17:57
【问题描述】:
我正在查看这个示例 - https://github.com/pytorch/examples/blob/master/dcgan/main.py,我有一个基本问题。
fake = netG(noise)
label = Variable(label.fill_(fake_label))
output = netD(fake.detach()) # detach to avoid training G on these labels
errD_fake = criterion(output, label)
errD_fake.backward()
D_G_z1 = output.data.mean()
errD = errD_real + errD_fake
optimizerD.step()
我明白为什么我们在变量fake 上调用detach(),这样就不会为生成器参数计算梯度。我的问题是,因为optimizerD.step() 将只更新与鉴别器相关的参数,这有关系吗?
OptimizerD 定义为:
optimizerD = optim.Adam(netD.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999))
此外,在下一步我们将更新生成器的参数时,在此之前我们将调用netG.zero_grad(),它最终会删除所有先前计算的梯度。此外,当我们更新 G 网络的参数时,我们会这样做 - output = netD(fake)。在这里,我们没有使用分离。为什么?
那么,为什么要在上面的代码中分离变量(第 3 行)?
【问题讨论】:
标签: pytorch