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

瓦西·艾哈迈德|

我正在查看此示例-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()

我知道为什么我们要调用detach()variable fake,以便不为Generator参数计算梯度。我的问题是,这是否重要,因为optimizerD.step()仅更新与鉴别器相关的参数?

OptimizerD定义为: optimizerD = optim.Adam(netD.parameters(), lr=opt.lr, betas=(opt.beta1, 0.999))

此外,在下一步中,当我们更新Generator的参数时,在此之前,我们将调用netG.zero_grad()最终删除所有先前计算的梯度。此外,当我们更新G网络的参数时,我们执行- output = netD(fake)在这里,我们不使用分离。为什么?

那么,为什么在上面的代码中必须分离变量(第3行)?

詹斯·彼得森

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

没错,调用之前optimizerD仅使用更新netD和渐变,因此分离是不必要的,它仅节省时间,因为您无需为生成器计算渐变。netGnetG.zero_grad()

基本上,您也可以自己回答其他问题,fake因为您特别希望计算渐变netG以更新其参数,所以您不会在第二个步骤中感到困惑

请注意,在第二个块中real_label如何其用作的相应标签fake,因此,如果鉴别器发现虚假输入是真实的,则最终损失很小,反之亦然,这恰恰是生成器想要的。不知道这是不是让您感到困惑,但这实际上是与对鉴别器进行假输入训练相比的唯一区别。

编辑

请参阅FatPanda的评论!我原来的回答实际上是不正确的。.backward()调用时,Pytorch销毁了计算图(的一部分)如果没有之前分离errD_fake.backward()errG.backward()通话以后会无法backprop到发生器,因为所需图形不再可用(除非您指定retain_graph=True)。我松了一口气,Soumith犯了同样的错误:D

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Java

为什么在此示例中调用哈希码?

来自分类Dev

为什么在此示例中需要“ where T:class”?

来自分类Dev

为什么在此示例中调用了复制构造函数?

来自分类Dev

React-为什么在此示例中不需要绑定?

来自分类Dev

为什么在此代码示例中需要@Output EventEmitter?

来自分类Dev

为什么在此ngrx示例中需要takeUntil?

来自分类Dev

为什么在此@ngrx示例中需要重新选择createSelector?

来自分类Dev

什么是AllowAmbiguousTypes,为什么在此“ forall”示例中需要它?

来自分类Dev

在此示例中,为什么模板变量“ ngModel”的值是

来自分类Dev

为什么在此示例中StateT更快?

来自分类Dev

为什么在此MobX示例中需要“获取”

来自分类Dev

为什么在此示例中,将with()用作map()调用中的函数不起作用?

来自分类Dev

为什么在此示例中需要括号?

来自分类Dev

为什么在此队列示例中需要取消任务?

来自分类Dev

为什么在此JavaScript示例中调用相同方法会有不同的输出?

来自分类Dev

为什么在此示例中未调用某些析构函数

来自分类Dev

为什么在此示例中不能两次调用t.join?

来自分类Dev

为什么在此示例中需要Handler对象?

来自分类Dev

为什么在此示例中变量范围不可用

来自分类Dev

为什么在此封装示例中为私有变量分配了两次?

来自分类Dev

为什么在此示例中,调用(f arg)和显式调用f的主体会产生不同的结果?

来自分类Dev

为什么在此Java示例中需要强制转换HttpURLConnection?

来自分类Dev

为什么在SAML请求中需要对ADFS签名?

来自分类Dev

为什么在此angular2示例中仍需要@inject?

来自分类Dev

为什么在CSOM示例中可以执行查询之前我不需要对用户进行身份验证

来自分类Dev

在此示例中,为什么枚举不需要创建对象?

来自分类Dev

为什么在此示例代码中不需要 readSync?

来自分类Dev

为什么只读对象需要对象中的可选属性?

来自分类Dev

在此示例中需要帮助识别类/原始实例变量

Related 相关文章

  1. 1

    为什么在此示例中调用哈希码?

  2. 2

    为什么在此示例中需要“ where T:class”?

  3. 3

    为什么在此示例中调用了复制构造函数?

  4. 4

    React-为什么在此示例中不需要绑定?

  5. 5

    为什么在此代码示例中需要@Output EventEmitter?

  6. 6

    为什么在此ngrx示例中需要takeUntil?

  7. 7

    为什么在此@ngrx示例中需要重新选择createSelector?

  8. 8

    什么是AllowAmbiguousTypes,为什么在此“ forall”示例中需要它?

  9. 9

    在此示例中,为什么模板变量“ ngModel”的值是

  10. 10

    为什么在此示例中StateT更快?

  11. 11

    为什么在此MobX示例中需要“获取”

  12. 12

    为什么在此示例中,将with()用作map()调用中的函数不起作用?

  13. 13

    为什么在此示例中需要括号?

  14. 14

    为什么在此队列示例中需要取消任务?

  15. 15

    为什么在此JavaScript示例中调用相同方法会有不同的输出?

  16. 16

    为什么在此示例中未调用某些析构函数

  17. 17

    为什么在此示例中不能两次调用t.join?

  18. 18

    为什么在此示例中需要Handler对象?

  19. 19

    为什么在此示例中变量范围不可用

  20. 20

    为什么在此封装示例中为私有变量分配了两次?

  21. 21

    为什么在此示例中,调用(f arg)和显式调用f的主体会产生不同的结果?

  22. 22

    为什么在此Java示例中需要强制转换HttpURLConnection?

  23. 23

    为什么在SAML请求中需要对ADFS签名?

  24. 24

    为什么在此angular2示例中仍需要@inject?

  25. 25

    为什么在CSOM示例中可以执行查询之前我不需要对用户进行身份验证

  26. 26

    在此示例中,为什么枚举不需要创建对象?

  27. 27

    为什么在此示例代码中不需要 readSync?

  28. 28

    为什么只读对象需要对象中的可选属性?

  29. 29

    在此示例中需要帮助识别类/原始实例变量

热门标签

归档