小编Moo*_*oot的帖子

如何使用 autograd.grad 计算 PyTorch 中参数损失的 Hessian 矩阵

我知道有很多关于 pytorch 中“计算 Hessian 矩阵”的内容,但据我所知,我还没有发现任何对我有用的内容。因此,为了尽可能精确,我想要的 Hessian 矩阵是损失相对于网络参数的梯度的雅可比矩阵。也称为参数的二阶导数矩阵。

我发现一些代码可以以直观的方式工作,尽管速度不应该很快。显然,它只是计算参数与参数之间的损失梯度的梯度,并且一次只计算一个(梯度的)元素。我认为逻辑绝对是正确的,但我收到了一个错误,与requires_grad. 我是 pytorch 初学者,所以也许这是一件简单的事情,但错误似乎是说它不能接受变量的梯度env_grads,这是之前 grad 函数调用的输出。

任何对此的帮助将不胜感激。这是错误消息后面的代码。我还打印出了该env_grads[0]变量,因此我们可以看到它实际上是一个张量,这是上一次调用的正确输出grad

env_loss = loss_fn(env_outputs, env_targets)
total_loss += env_loss
env_grads = torch.autograd.grad(env_loss, params,retain_graph=True)

print(env_grads[0])
hess_params = torch.zeros_like(env_grads[0])
for i in range(env_grads[0].size(0)):
    for j in range(env_grads[0].size(1)):
        hess_params[i, j] = torch.autograd.grad(env_grads[0][i][j], params, retain_graph=True)[0][i, j] #  <--- error here
print(hess_params)
Run Code Online (Sandbox Code Playgroud)

输出:

tensor([[-6.4064e-03, -3.1738e-03,  1.7128e-02,  8.0391e-03],
        [ 7.1698e-03, -2.4640e-03, -2.2769e-03, -1.0687e-03],
        [-3.0390e-04, -2.4273e-03, -4.0799e-02, -1.9149e-02],
        ...,
        [ 1.1258e-02, -2.5911e-05, -9.8133e-02, -4.6059e-02],
        [ 8.1502e-04, -2.5814e-03, …
Run Code Online (Sandbox Code Playgroud)

python hessian pytorch

11
推荐指数
2
解决办法
9541
查看次数

使用Scipy的Keras BFGS训练最小化

我想用BFGS训练在Keras中实现的前馈神经网络.为了查看是否可以完成,我使用scipy.optimize.minimize以下代码实现了Perceptron .

from __future__ import print_function
import numpy as np
from scipy.optimize import minimize
from keras.models import Sequential
from keras.layers.core import Dense

# Dummy training examples
X = np.array([[-1,2,-3,-1],[3,2,-1,-4]]).astype('float')
Y = np.array([[2],[-1]]).astype('float')

model = Sequential()
model.add(Dense(1, activation='sigmoid', input_dim=4))

def loss(W):
    weightsList = [np.zeros((4,1)), np.zeros(1)]
    for i in range(4):
        weightsList[0][i,0] = W[i]
    weightsList[1][0] = W[4]
    model.set_weights(weightsList)
    preds = model.predict(X)
    mse = np.sum(np.square(np.subtract(preds,Y)))/len(X[:,0])
    return mse

# Dummy first guess
V = [1.0, 2.0, 3.0, 4.0, 1.0]
res = minimize(loss, x0=V, …
Run Code Online (Sandbox Code Playgroud)

python scipy neural-network keras

7
推荐指数
1
解决办法
2914
查看次数

标签 统计

python ×2

hessian ×1

keras ×1

neural-network ×1

pytorch ×1

scipy ×1