报错:Leaf Tensor that doesn't stop gradient can't use inplace stra
收藏
报错:Leaf Tensor that doesn't stop gradient can't use inplace stra
收藏
网络框架是使用了CBAM模块的ResNet网络,在试图手动控制batchnorm里的梯度参数(也许)时,遇到了报错ValueError: (InvalidArgument) Leaf Tensor (batch_norm2d_0.w_0) that doesn't stop gradient can't use inplace strategy.
[Hint: Expected self->IsLeaf() && !self->OverridedStopGradient() == false, but received self->IsLeaf() && !self->OverridedStopGradient():1 != false:0.] (at ..\paddle\fluid\pybind\imperative.cc:994)
这是报错的代码
有无大佬知道这是为啥吗?该咋解决
0
收藏
请登录后评论
我也遇到了类似的问题,你的 paddle 版本是?
可以看一下 paddle issue #42190 (aistudio 不让放链接。。。)
主要原因是 (如下内容来自 paddle 框架研发)
这个意思是如果一个Tensor是叶节点并且需要计算梯度的话,这里索引赋值的inplace操作就不能使用
因为如果原来的Tensor值被inplace操作覆盖了,可能就没法往回算梯度了
就比如x = x.reshape_()这种,输出的Tensor和输入是同一个
x[] = val 这种也相当于输入和输出共用了同一个Tensor
https://github.com/PaddlePaddle/Paddle/issues/42190
同学你好呀,请问你的问题解决了吗,我也遇到了同样的问题0.0~,想请求帮助呀
paddle 框架中 叶子节点 如参数,如果是需要计算梯度的,不支持 inplace 操作,如 add_(xxx) 等。
如果你需要手动修改参数的值,可以将参数 设置成不需要梯度: p.stop_gradient = True, 并在 with no_grad 上下文里对 参数值做修改。