我试图用两个不同的损失函数分别训练生成器和鉴别器。这是计算损耗和梯度的代码。
A_pre_B = netG_A2B(noisy_A) pixel_loss_A2B_A = criterion_identity(synth_C,A_pre_B) * 0.01 pred_fake = netD_B(A_pre_B) loss_GAN_A2B = criterion_GAN(pred_fake, target_real) loss_G = pixel_loss_A2B_A + loss_GAN_A2B loss_G.backward() optimizer_G.step() optimizer_D_B.zero_grad() fake_B = A_pre_B.detach() pred_fake = netD_B(fake_B) loss_D_fake = criterion_GAN(pred_fake, target_fake) loss_D_B = (loss_D_real + loss_D_fake)*0.5 loss_D_B.backward() optimizer_D_B.step()
我读到here,在计算反向传播的梯度时,应保持发生器和鉴别器的权重保持不变。培训融合得不好。这个 answer说,在更新步骤中,我的生成器优化器不会更新鉴别器权重。但是当前我调用A_pre_B.detach()并从生成器中重新获取pred_fake。为什么我不能在这里调用pred_fake.detach()?我这样做时会收到内存泄漏错误。