我正在研究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_vec
(e_loss
的一次向前传递所困扰,以便E
通过latent_vec_no_grad
反向传播,而d_loss
传递D
1}}以便latent_vec.block_backprop = True
仅通过E
)反向传播。
理想情况下,优化==
后可以设置list
等标志,但不存在此标志。是否有一个优雅的解决方案可以使培训达到最佳状态?