一般来说,存在一个问题:最初,某个函数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您正在使用的库有自己的雅可比矩阵。