2017-05-26 40 views
2

我將此作爲問題提交給cycleGAN pytorch implementation,但由於沒有人在那裏回覆我,我會在此再次提問。pytorch autograd是如何工作的?

我主要困惑的事實,多次向前傳球被一個單一的向通行之前調用,查看代碼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(我認爲)後向傳遞總是計算w.r.t最後輸入數據。在這種情況下,loss_G的反向傳播將是錯誤的。反之,他們應該三次落後傳球,每一次傳球都會立即傳球。

具體地說,netG_A的從loss_G_A梯度是w.r.t real_A但從loss_cycle_B其梯度是w.r.t fake_A

我認爲這是以某種方式在pytorch照顧。但是模型如何知道哪個輸入數據應該計算梯度?

回答

2

Pytorch使用基於磁帶的系統進行自動分化。這意味着它會從最後一次操作中反轉。我認爲最好的理解方式是從這個過程中繪製一張圖表。我附上了一個我親手做的enter image description here

現在你會看到有些模塊是「重複的」。我想到他們的方式與我對RNN的想法是一樣的。這樣,漸變將被添加。

+0

所以通過網絡的輸入是以某種方式「緩存」?確實,這與RNN非常相似,我從來沒有註冊它。 – yfi