python - 如何使用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,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.]])

为什么会发生这种情况?

最佳答案

神经网络是 universal function approximator 。这意味着,只要有足够的计算资源、训练时间、节点等,您就可以逼近任何函数
如果没有任何关于在第一个示例中如何训练网络的更多信息,我怀疑您的网络根本不适合底层功能,这意味着您的网络的内部表示实际上模拟了一个<强>不同的功能!

对于第二个代码片段,自动微分确实给出了精确偏导数。它通过不同的方法来实现,请参阅 another one of my answers on SO ,专门讨论 AutoDiff/Autograd 主题。

关于python - 如何使用PyTorch计算偏导数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51500010/

相关文章:

python - 删除 Django,因为我现在使用 VirtualEnv

python - 使用多个 for 和 ifs/elif 缩短循环以列表理解

python - 在 Matplotlib 3D 散点图中显示线的长度

Tensorflow 2.0将nlp的预处理tonkezier保存到tensorflow服务器中

python - 在python中建立数据库连接的正确方法

machine-learning - 使用默认数据集和训练的形状预测器精度较低

python - 这个警告在 PATE 分析中意味着什么?

python - 创建随机线性无关向量

python - 导入错误 : cannot import name 'AutoModelWithLMHead' from 'transformers'

python - Orange 数据挖掘工具中的层次聚类