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

报错代码

self.loss_G_latent = (self.latent_i.mean() - self.latent_t.mean()) * self.opt.lambda_A
self.loss_G_latent.backward()

运行到最后一行时报错:

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

其中,latent_i和latent_t都是网络中间latent layer的输出。

这一错误的原因还没有搞清楚,大概好像是latnet_t和latent_i都是网络中间层的输出,所以emmmmmG反向传播的时候就会出问题???

真的没有搞明白,下面这篇文章说的比较清楚:

https://zhuanlan.zhihu.com/p/38475183

 

但经过尝试找到了如下解决方案:

self.loss_G_latent = (self.latent_i.mean().detach() - self.latent_t.mean().detach()) * self.opt.lambda_A
self.loss_G_latent.backward()

即可解决报错。https://github.com/pytorch/pytorch/issues/6990

这里的detach返回了一个新的从当前图中分离的 Variable,且返回的 Variable 永远不会需要梯度。

然而为什么就解决报错了呢?

 

但无论如何使用detach的确能够避免类似的in-place报错,下次有时间再去追究原因。

 

更新:

上述方法的确可以解决报错,但不可取;

一旦使用detach则latent_i和latent_t将不具备梯度,无法反向传播,导致网络不收敛!

建议采取的方案是建立子网络,避免求梯度时发生前面参数的改变导致梯度计算错误从而报错。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

R.X. NLOS

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值