动态图应用fluid.dygraph.grad 报错
Created by: zylustc
Paddle 版本 1.8.1 程序:
import paddle.fluid as fluid
import numpy as np
with fluid.dygraph.guard():
value = np.arange(100).reshape(10,2, 5).astype("float32")
out1 = np.zeros((2,3),dtype=np.float32)
out=fluid.dygraph.to_variable(out1)
a = fluid.dygraph.to_variable(value)
a.stop_gradient=False
linear=[]
for i in range(10):
linear.append(fluid.dygraph.Linear(5, 3))
for i in range(10):
out = out+linear[i](a[i,:,:])
print(out)
dx=fluid.dygraph.grad(outputs=out,inputs=a,create_graph=True,retain_graph=True, \
only_inputs=True,allow_unused=False)[0]
print(dx.numpy())
dx.backward()
print(a.gradient())
报错信息 Traceback (most recent call last): File "31.py", line 17, in only_inputs=True,allow_unused=False)[0] File "", line 2, in grad File "/share/group-soft/anaconda/install/envs/paddle/lib/python3.7/site-packages/paddle/fluid/wrapped_decorator.py", line 25, in impl return wrapped_func(*args, **kwargs) File "/share/group-soft/anaconda/install/envs/paddle/lib/python3.7/site-packages/paddle/fluid/framework.py", line 216, in impl return func(*args, **kwargs) File "/share/group-soft/anaconda/install/envs/paddle/lib/python3.7/site-packages/paddle/fluid/dygraph/base.py", line 559, in grad create_graph, retain_graph, allow_unused, only_inputs) paddle.fluid.core_avx.EnforceNotMet:
C++ Call Stacks (More useful to developers):
0 std::string paddle::platform::GetTraceBackString<std::string const&>(std::string const&, char const*, int) 1 paddle::platform::EnforceNotMet::EnforceNotMet(std::string const&, char const*, int) 2 paddle::imperative::ReadyGradVarInfoMap::GetTarget(paddle::imperative::VariableWrapper const*) const 3 paddle::imperative::PartialGradTask::CreateResult() 4 paddle::imperative::PartialGradTask::Run() 5 paddle::imperative::PartialGradEngine::Execute()
Error Message Summary:
PermissionDeniedError: Target var generated_var_1@GRAD should not be nullptr [Hint: iter->second should not be null.] at (/paddle/paddle/fluid/imperative/partial_grad_engine.cc:501)
我发现去掉python的控制流(for 循环),就可以跑通,可以得到正确的dx, 但是a.gradient()返回的是None, 就是请教一下,grad这个api使用时,组网过程不能有python的控制流吗?还有为什么直接手动append的组网返回的 a.gradient() 依然是None?