一般来说,存在一个问题:最初,某个函数function
以一个向量作为输入numpy.ndarray
,随后将其分解为多个向量和矩阵。
function
因为是在里面用numpy
,所以要严格接受numpy.ndarray
。
必须使用需要雅可比矩阵的scipy.optimize.minimize
方法寻找最小值。BFGS
要计算雅可比矩阵,。被使用torch.autograd.functional.jacobian
。
def jac(x, function):
def inner(x):
print(x)
return tensor(function(x.detach().numpy()))
return jacobian(inner, from_numpy(x)).numpy()
但它总是返回一个零向量,这就是为什么该函数在处都有最小值。
更新:
function
在这种情况下,是任何接受numpy.ndarray
并返回数字的函数。重要的是,此函数内部使用的代码在作为输入时可以工作numpy.ndarray
,但在作为输入时不起作用torch.tensor
。
例如(作为测试函数),function
它可以是Rosenbrock函数:
def RosenbrockFunction(x):
print(x.dot(np.eye(2)))
return (1 - x[0]) ** 2 + 100 * (x[1] - x[0] ** 2) ** 2
该行print(x.dot(np.eye(2)))
代表无法执行的代码torch.tensor
。
如何解决这个问题?
torch
计算雅可比矩阵需要访问函数及其梯度。如果没有梯度,输出将为零。而且你不会有渐变,显然是因为使用了detach()
,但可能不仅仅是因为这个,我不太明白。一般来说,使用torch
它是一门独立的艺术和一种独立的思维方式;最好不要将它与其他库混合,而是只在其上写入所有内容。或者根本不使用它。SciPy
您正在使用的库有自己的雅可比矩阵。