gpt4 book ai didi

deep-learning - pytorch autograd 是如何工作的?

转载 作者:行者123 更新时间:2023-12-01 12:20:47 26 4
gpt4 key购买 nike

我将此作为问题提交给 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_A 来自 loss_G_A 的梯度是 w.r.t real_A 但它来自 loss_cycle_B 的梯度是 w.r.t fake_A.

我假设这是在 pytorch 中以某种方式处理的。但是模型如何知道应该计算哪些输入数据的梯度?

最佳答案

Pytorch 使用基于磁带的系统进行自动微分。这意味着它将从它所做的最后一个操作反向传播。我认为最好的理解方式是根据流程制作图表。我附上一张我亲手做的enter image description here

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

关于deep-learning - pytorch autograd 是如何工作的?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44198736/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com