我有一个训练有素的网络。我想计算输出与输入的梯度。通过查询 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]
Run Code Online (Sandbox Code Playgroud)
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))
Run Code Online (Sandbox Code Playgroud)
但我得到了完全不同的结果。由 计算的梯度torch.autograd.grad
为-0.009522666223347187
,而由计算的梯度scipy.misc.derivative
为-0.014901161193847656
。
计算上有什么问题吗?还是我用torch.autograd.grad
错了?