我将此问题提交给了cycleGAN pytorch implementation,但由于没有人在那里回复我,我会在这里再次提问。
我主要感到困惑的是,在一次向后传球之前调用了多个前向传球,请参阅代码cycle_gan_model中的以下内容
# GAN loss
# D_A(G_A(A))
self.fake_B = self.netG_A.forward(self.real_A)
pred_fake = self.netD_A.forward(self.fake_B)
self.loss_G_A = self.criterionGAN(pred_fake, True)
# D_B(G_B(B))
self.fake_A = self.netG_B.forward(self.real_B)
pred_fake = self.netD_B.forward(self.fake_A)
self.loss_G_B = self.criterionGAN(pred_fake, True)
# Forward cycle loss G_B(G_A(A))
self.rec_A = self.netG_B.forward(self.fake_B)
self.loss_cycle_A = self.criterionCycle(self.rec_A, self.real_A) * lambda_A
# Backward cycle loss G_A(G_B(B))
self.rec_B = self.netG_A.forward(self.fake_A)
self.loss_cycle_B = self.criterionCycle(self.rec_B, self.real_B) * lambda_B
# combined loss
self.loss_G = self.loss_G_A + self.loss_G_B + self.loss_cycle_A + self.loss_cycle_B + self.loss_idt_A + self.loss_idt_B
self.loss_G.backward()
我看到它的方式,G_A和G_B每个都有三个前向传球,两次接受真实数据(real_A
或real_B
)和两次假数据(fake_B
或{{ 1}})。
在张量流(我认为)中,后向传递总是在最后一个输入数据中计算出来。在这种情况下,fake_A
的反向传播是错误的。一个人应该做三次向后传球,每次都是在他们的前锋传球后立即进行。
具体来说,来自loss_G
的{{1}}渐变是w.r.t netG_A
,但来自loss_G_A
的渐变是w.r.t real_A
。
我认为这是在pytorch中以某种方式处理的。但是模型如何知道它应该计算哪些输入数据的梯度?