我正在尝试获得theano梯度和粗麻布的矢量化版本,即我想在几个点计算梯度和粗麻布,在矩阵中给出,如下所示:
我有一个功能:
f(x_1,x_2,..,x_n)=exp(x_1^2+x_2^2+...+x_n^2)
我想用一个命令在多个点计算它的梯度。我可以这样做:
x = T.matrix('x')
y = T.diag(T.exp(T.dot(x,x.T)))
J = theano.grad(cost = y.sum(), wrt = x)
f = theano.function(inputs = [x], outputs = J)
f([[1,2],[3,4]])
它返回一个矩阵,其中行是在点 (1,2) 和 (3,4) 计算的梯度。我想为粗麻布得到相同的结果(在这种情况下,它将是一个与矩阵相反的 3 维张量,但相同的想法)。以下代码:
H = theano.gradient.hessian(cost = y.sum(), wrt = x)
返回错误:
AssertionError: tensor.hessian expects a (list of) 1 dimensional variable as `wrt`
我能够使用以下代码获得适当的结果
J = theano.grad(cost = y.sum(), wrt = x)
H = theano.gradient.jacobian(expression = J.flatten(), wrt = x)
g = theano.function(inputs = [x], outputs = H)
g([[1,2],[3,4]])
但它会产生许多不必要的零,并且似乎是一种获得所需结果的低效且“丑陋”的方式。有没有人遇到过类似的问题,或者你能提出什么建议吗?