首页 Paddle框架 帖子详情
paddle.grad无法对paddle.nn.Layer模型求高阶导数
收藏
快速回复
Paddle框架 问答深度学习 456 2
paddle.grad无法对paddle.nn.Layer模型求高阶导数
收藏
快速回复
Paddle框架 问答深度学习 456 2

对一个一般的函数利用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
收藏
回复
全部评论(2)
时间顺序
U
Ukin
#3 回复于2023-12

同样的问题,兄弟,请问找到了解困办法吗

0
回复
SAC_nAyR
#4 回复于2023-12

找到了,时间有点久远记不清了,大概就是不能用ReLU。用了ReLU以后求二阶导梯度全为0,torch的结果就是0,放到paddle里就报错。把ReLU改成sigmoid之类的就好了

0
回复
需求/bug反馈?一键提issue告诉我们
发现bug?如果您知道修复办法,欢迎提pr直接参与建设飞桨~
在@后输入用户全名并按空格结束,可艾特全站任一用户