gpt4 book ai didi

pytorch - 为什么在此示例中需要对变量调用 detach ?

转载 作者:行者123 更新时间:2023-12-02 11:40:11 25 4
gpt4 key购买 nike

我正在经历这个例子 - 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 行)?

最佳答案

原始答案(错误/不完整)

你是对的,optimizerD仅更新netD,并且在netG.zero_grad()之前不使用netG上的梯度 被调用,因此不需要分离,它只是节省时间,因为您没有计算生成器的梯度。

您基本上也在自己回答其他问题,您不会在第二个 block 中分离 fake ,因为您特别想要计算 netG 上的梯度以便能够更新其参数。

注意 the second block real_label 中的做法用作fake的对应标签,因此如果判别器发现假输入是真实的,则最终的损失很小,反之亦然,这正是您想要的生成器。不确定这是否让您感到困惑,但这确实是与在虚假输入上训练鉴别器相比的唯一区别。

编辑

请看FatPanda的评论!我原来的答案其实是不正确的。当调用 .backward() 时,Pytorch 会销毁(部分)计算图。如果在 errD_fake.backward() 之前没有分离,稍后的 errG.backward() 调用将无法反向传播到生成器中,因为所需的图不再可用(除非您指定retain_graph=True)。我很欣慰 Soumith 犯了同样的错误:D

关于pytorch - 为什么在此示例中需要对变量调用 detach ?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46944629/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com