2017-10-26 3 views
0

私はこの例を進んでいた - 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() 

私は勾配が発生パラメータに対して計算されないように、なぜ我々は、変数fakedetach()を呼び出すことを理解しています。私の質問は、optimizerD.step()がDiscriminatorに関連するパラメータのみを更新しようとしているので重要ですか?

さらに、次のステップでGeneratorのパラメータを更新する前に、netG.zero_grad()を呼び出して、以前に計算されたすべての勾配を削除します。また、Gネットワ​​ークのパラメータを更新するときは、output = netD(fake)を実行します。ここでは、デタッチを使用していません。どうして?

なぜ、上記のコードで変数(行3)を切り離す必要があるのですか?

答えて

0

あなたは正しい、optimizerDだけnetD更新しnetG.zero_grad()が呼び出される前netG上のグラデーションがとても取り外し、使用されていないが、あなたが発電のための勾配を計算していないので、それだけで、時間を節約し、必要はありません。

また、netGの勾配を計算してそのパラメータを更新できるようにするため、基本的には別の質問にも答えます。fakeを2番目のブロックに切り離さないでください。第二のブロックにreal_labelfakeのための対応するラベルとして使用されているので、弁別が本物であることを偽の入力を検出した場合、最終的に損失が小さく、あなたが欲しいものを正確にはその逆、どのように

注意ジェネレータ。それがあなたを混乱させるかどうかはわかりませんが、弁別器を偽の入力に訓練するのと比べて唯一の違いです。

0

偽の変数がGeneratorグラフ[1]の一部になっているので、偽の変数は不要です。あなたはそれをDiscriminatorに入れる前に、あなたはそれを彼から「切り離す」必要があります。

関連する問題