paddle.grad无法对paddle.nn.Layer模型求高阶导数
收藏
对一个一般的函数利用paddle.grad是可以求高阶导数,好像每次求导都会在原本的图的基础上加入求导的部分
x = paddle.to_tensor([4]) x.stop_gradient = False y = x*x*x dx = paddle.grad(y, x, grad_outputs=None, retain_graph=True, create_graph=True, only_inputs=True, allow_unused=False, no_grad_vars=None)[0] dx2 = paddle.grad(dx, x, grad_outputs=None, retain_graph=True, create_graph=True, only_inputs=True, allow_unused=False, no_grad_vars=None)[0] print(dx.item()," ",dx2.item())
但是对paddle.nn.Layer构造的模型无法求高阶导数,只能求一阶导数,求高阶导数会报错,无法从图上找到高阶导数与输入变量的关系,create_graph和retain_graph好像没起作用,执行到最后一行会报错
class net(paddle.nn.Layer): def __init__(self): super(net,self).__init__() self.linear1 = nn.Linear(1, 100) self.linear2 = nn.Linear(100,1) self.relu1 = nn.ReLU() def forward(self,x): y = self.linear1(x) y = self.relu1(y) y = self.linear2(y) return y model = net() t = paddle.to_tensor([4.0]) t.stop_gradient = False Sx = model(t) dSx_dT = paddle.grad(Sx, t, grad_outputs=None, retain_graph=True, create_graph=True, only_inputs=True, allow_unused=False, no_grad_vars=None) d2Sx_dT2 = paddle.grad(dSx_dT, t, grad_outputs=None, retain_graph=True, create_graph=True, only_inputs=True, allow_unused=False, no_grad_vars=None)
2
收藏
请登录后评论
同样的问题,兄弟,请问找到了解困办法吗
找到了,时间有点久远记不清了,大概就是不能用ReLU。用了ReLU以后求二阶导梯度全为0,torch的结果就是0,放到paddle里就报错。把ReLU改成sigmoid之类的就好了