【问题标题】:how does the pytorch autograd work?pytorch autograd 是如何工作的?
【发布时间】:2017-10-27 04:19:21
【问题描述】:

我将此作为问题提交给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_Areal_B),两次接受假数据(fake_Bfake_A)。

在 tensorflow 中(我认为),向后传递总是根据最后一个输入数据计算。在这种情况下,loss_G 的反向传播将是错误的。相反,一个人应该做三次反向传球,每次都紧跟在他们涉及的向前传球之后。

具体来说,netG_Aloss_G_A 的渐变是 w.r.t real_A 但它从 loss_cycle_B 的渐变是 w.r.t fake_A

我认为这在 pytorch 中得到了解决。但是模型如何知道它应该计算梯度的输入数据呢?

【问题讨论】:

    标签: deep-learning pytorch automatic-differentiation


    【解决方案1】:

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

    现在您会看到一些模块是“重复的”。我对它们的看法与我对 RNN 的看法相同。这样,渐变就会被添加。

    【讨论】:

    • 所以通过网络的输入以某种方式被“缓存”了?确实这个和RNN很像,我没注册过。
    猜你喜欢
    • 2020-05-12
    • 2020-07-11
    • 2018-09-06
    • 2021-02-27
    • 1970-01-01
    • 2018-12-24
    • 2019-07-02
    • 2020-05-13
    • 2020-09-15
    相关资源
    最近更新 更多