gpt4 book ai didi

neural-network - 如何使用 PyTorch 计算输出 w.r.t. 的梯度神经网络中的输入?

转载 作者:行者123 更新时间:2023-12-04 04:28:39 29 4
gpt4 key购买 nike

我有一个训练有素的网络。我想计算输出的梯度 w.r.t. 输入 .通过查询 PyTorch 文档, torch.autograd.grad 可能有用。
所以,我使用以下代码:

    x_test = torch.randn(D_in,requires_grad=True)
y_test = model(x_test)
d = torch.autograd.grad(y_test, x_test)[0]
model是神经网络。 x_test是大小 D_in 的输入和 y_test是标量输出。
我想通过 scipy.misc.derivative 将计算结果与数值差异进行比较.
所以,我通过设置一个索引来计算偏导数。
    idx = 3
x_test = torch.randn(D_in,requires_grad=True)
y_test = model(x_test)
print(x_test[idx].item())
d = torch.autograd.grad(y_test, x_test)[0]
print(d[idx].item())
def fun(x):
x_input = x_test.detach()
x_input[idx] = x
with torch.no_grad():
y = model(x_input)
return y.item()
x0 = x_test[idx].item()
print(x0)
print(derivative(fun, x0, dx=1e-6))

但我得到了完全不同的结果。 torch.autograd.grad计算的梯度是 -0.009522666223347187 ,
而那个来自 scipy.misc.derivative-0.014901161193847656 .

计算上有什么问题吗?或者我用 torch.autograd.grad错?

最佳答案

事实上,您给定的代码很可能是完全正确的。
让我通过将您重定向到反向传播的一些背景信息来解释这一点,或者更确切地说,在这种情况下是自动微分 (AutoDiff)。

许多包的具体实现都是基于 AutoGrad,这是获取 的常用技术。精确函数/图的导数。它可以通过本质上“反转”前向计算传递来计算原子功能块的分段导数(如加法、减法、乘法、除法等),然后“将它们链接在一起”来实现这一点。
我在 this question 中更详细的回答中解释了 AutoDiff 及其细节。 .

相反,scipy 的导数函数只是一个 近似值通过使用有限差分来计算这个导数。您将在附近点处获取函数的结果,然后根据这些点的函数值差异计算导数。这就是为什么您会看到两个梯度略有不同的原因,因为这可能是实际导数的不准确表示。

关于neural-network - 如何使用 PyTorch 计算输出 w.r.t. 的梯度神经网络中的输入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51666410/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com