只反向传播给定变量

时间:2018-03-02 00:59:44

标签: pytorch

我正在研究GAN,其中鉴别器对编码器产生的潜在空间矢量进行操作。细节并不重要,但如果你想看一下,描述模型的论文是https://arxiv.org/abs/1706.00409

基本上,我的问题是我的训练代码需要通过编码器进行不必要的反向传递,而我不知道如何绕过它以使其变得最佳。以下是相关代码,E是编码器,D是鉴别器。

latent_vec = E(input) #latent_vector will be a Variable with requires_grad=True
predictions = D(latent_vec)

e_loss = encoder_loss(predictions, ground_truth)
e_optimizer.zero_grad()
e_loss.backward() #backpropagates through both D and E, which is necessary
e_optimizer.step()

d_loss = discriminator_loss(predictions, ground_truth)
d_optimizer.zero_grad()
d_loss.backward() #backpropagates through D, but also through E unnecessarily
d_optimizer.step()

这仍然有效,因为优化器只修改了各自模型的参数,但效率低,因为d_loss.backward()通过E不必要地反向传播。我知道我可以重新创建latent_vec版本,以防止E使用latent_vec_no_grad = Variable(latent_vec.data)进行反向传播 D,但随后我会被latent_vece_loss的一次向前传递所困扰,以便E通过latent_vec_no_grad反向传播,而d_loss传递D 1}}以便latent_vec.block_backprop = True仅通过E)反向传播。

理想情况下,优化==后可以设置list等标志,但不存在此标志。是否有一个优雅的解决方案可以使培训达到最佳状态?

0 个答案:

没有答案