私はこの例を進んでいた - https://github.com/pytorch/examples/blob/master/dcgan/main.pyと私は基本的な質問があります。この例では、detachを変数で呼び出す必要があるのはなぜですか?
fake = netG(noisev)
labelv = Variable(label.fill_(fake_label))
output = netD(fake.detach()) # detach to avoid training G on these labels
errD_fake = criterion(output, labelv)
errD_fake.backward()
D_G_z1 = output.data.mean()
errD = errD_real + errD_fake
optimizerD.step()
私は勾配が発生パラメータに対して計算されないように、なぜ我々は、変数fake
にdetach()
を呼び出すことを理解しています。私の質問は、optimizerD.step()
がDiscriminatorに関連するパラメータのみを更新しようとしているので重要ですか?
さらに、次のステップでGeneratorのパラメータを更新する前に、netG.zero_grad()
を呼び出して、以前に計算されたすべての勾配を削除します。また、Gネットワークのパラメータを更新するときは、output = netD(fake)
を実行します。ここでは、デタッチを使用していません。どうして?
なぜ、上記のコードで変数(行3)を切り離す必要があるのですか?