Deep learning pytorch autograd是如何工作的?

Deep learning pytorch autograd是如何工作的?,deep-learning,pytorch,automatic-differentiation,Deep Learning,Pytorch,Automatic Differentiation,我将此作为一个问题提交给了cycleGAN,但由于那里没有人回复我,我将在这里再次询问 我主要感到困惑的是,在一次向后传递之前调用了多个向前传递,请参见下面的代码 在我看来,G_A和G_B各有三次向前传递,两次接受真实数据(real_A或real_B),两次接受虚假数据(fake_B或fake_A) 在tensorflow(我认为)中,反向过程总是通过最后一个输入数据来计算。在这种情况下,损耗的反向传播将是错误的。一个人应该做三次后传球,每次都紧跟在前传球之后 具体来说,netG_A从loss_

我将此作为一个问题提交给了cycleGAN,但由于那里没有人回复我,我将在这里再次询问

我主要感到困惑的是,在一次向后传递之前调用了多个向前传递,请参见下面的代码

在我看来,G_A和G_B各有三次向前传递,两次接受真实数据(
real_A
real_B
),两次接受虚假数据(
fake_B
fake_A

在tensorflow(我认为)中,反向过程总是通过最后一个输入数据来计算。在这种情况下,
损耗的反向传播将是错误的。一个人应该做三次后传球,每次都紧跟在前传球之后

具体来说,
netG_A
loss_A
的梯度是w.r.t
real_A
,但它从
loss_cycle_B
的梯度是w.r.t
fake_A


我想这在pytorch中已经被处理好了。但是,模型如何知道w.r.t应该计算哪些输入数据的梯度呢?

Pyrotch使用基于磁带的系统进行自动微分。这意味着它将从上次执行的操作中反向传播。我认为最好的理解方法是从过程中绘制一个图表。我附上一个我亲手做的


现在您将看到一些模块是“重复的”。我思考它们的方式与我思考RNN的方式相同;通过这种方式,只需添加渐变。

那么通过网络的输入以某种方式被“缓存”了吗?这是真的,这是非常相似的RNN,我从来没有注册过。
# 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()