Python 如何使用PyTorch计算偏导数?

Python 如何使用PyTorch计算偏导数?,python,machine-learning,pytorch,Python,Machine Learning,Pytorch,我想用PyTorch得到输出和输入之间的偏导数。假设我有一个函数Y=5*x1^4+3*x2^3+7*x1^2+9*x2-5,我训练一个网络来替换这个函数,然后我使用autograd来计算dYdx1,dYdx2: net = torch.load('net_723.pkl') x = torch.tensor([[1,-1]],requires_grad=True).type(torch.FloatTensor) y = net(x) grad_c = torch.autograd.grad(y,

我想用PyTorch得到输出和输入之间的偏导数。假设我有一个函数Y=5*x1^4+3*x2^3+7*x1^2+9*x2-5,我训练一个网络来替换这个函数,然后我使用autograd来计算
dYdx1,dYdx2

net = torch.load('net_723.pkl')
x = torch.tensor([[1,-1]],requires_grad=True).type(torch.FloatTensor)
y = net(x)
grad_c = torch.autograd.grad(y,x,create_graph=True,retain_graph=True)[0] 
然后我得到一个错误的导数,如下所示:

>>>tensor([[ 7.5583, -5.3173]])
但当我使用函数计算时,我得到了正确的答案:

Y = 5*x[0,0]**4 + 3*x[0,1]**3 + 7*x[0,0]**2 + 9*x[0,1] - 5
grad_c = torch.autograd.grad(Y,x,create_graph=True,retain_graph=True)[0]
>>>tensor([[ 34.,  18.]])
为什么会发生这种情况?

神经网络是一种神经网络。这意味着,对于足够的计算资源、训练时间、节点等,您可以近似任何函数。
如果没有关于您在第一个示例中如何训练人际网络的进一步信息,我会怀疑您的人际网络根本不适合基本功能,这意味着您的人际网络的内部表示实际上模拟了不同的功能


对于第二个代码段,自动微分确实给出了精确的偏导数。它是通过不同的方法实现的,请参见,关于AutoDiff/Autograd的主题。

thx对于您的回答,我训练的网络有四层,每层200个节点,训练数据是-1和1之间的随机数,我使用数学函数计算目标。MSE损耗约为3E-4。我认为这个适合是正确的,但我通过autograd得到了错误的答案。你将传递多少样本到培训中?此外,您还可以尝试根据基本事实绘制网络生成的函数(
np.linspace
是您的朋友,然后在此基础上评估您的网络)。由于每层的节点数量如此之多,我怀疑您将完全过度拟合给定的数据点,并且有一个超出该范围的高偏差(由于高度复杂)。一个直观的例子是关于谢谢你的回复,你的观点和我的老师很相似。我使用np.linspace生成5000个数据点,它可能太小了。如果网络匹配足够好,你认为我计算输出和输入之间导数的方法会得到正确答案吗?好吧,这取决于你的最终目标(我个人总是使用显式表示,如果它可用,比如你的情况)。我更倾向于建议缩小网络的规模(每层只有32个节点,或者可能更少。在我看来,这足以描述这样一个“足够好”的功能,而且你可以为自己节省一些培训时间。如果你还没有这样做,也要确保在培训期间洗牌你的数据。