one of the variables needed for gradient computation has been modified by an inplace operation:

项目场景:

这是在训练GAN网络的时候最容易报错的地方。


问题描述

在训练GAN网络的时候,修改别人的代码,准确的说在计算损失的地方修改一些内容,然后就不知觉的出现该错误,一开始看帖子以为是反向传播:

backward()

的错误,backward()有一个参数就是retain_grad,当然默认是Fulse,改为True,但是还是报错,所以问题不是出在这里,这里是在往往对同一个梯度网同时进行多次反向传播的时候需要修改为True,因为默认在反向传播一次之后就释放掉了。



原因分析:

出现该问题的真正原因是:正如提示的那样,梯度计算所需的一个变量已被原地操作修改了。出现该问题的主角是detach(),在训练GAN网络的时候,鉴别器反向传播的时候是不能影响生成器的反向传播,因为生成器是主干网络,如果在鉴别器反向传播进行梯度下降会直接影响到生成器的反向传播,再者就会出现这个错误。


解决方案:

解决办法就是在鉴别器判断输出output的时候使用detach()

dis_fake = outputs.detach()

这样就能解决问题。另外detach()不能随便使用,detach()是阻断反向传播的,也就是说没有梯度图,虽然在训练生成器的时候对output使用detach()不会报错,但是会对结果产生影响,对计算哪一个损失所传入的output.detach(),那么意味着这个损失将不会对该网络起到作用,简而言之就是等于你没有使用该损失训练该网络,你可以试一下,最好将生成器的损失的output都进行detach(),(因为只是修改其中一个难以发现,剩余的损失函数还在起作用)你会发现损失一直没变,网络没有进行参数跟新。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值