Python 带张量函数的Theano梯度

Python 带张量函数的Theano梯度,python,theano,differentiation,Python,Theano,Differentiation,我有一个函数,可以计算三维空间中标量场的值,所以我为它提供了x、y和z坐标的三维张量(由numpy.meshgrid获得),并在任何地方使用元素操作。这正如预期的那样有效 现在我需要计算标量场的梯度。我一直在玩弄theano.tensor.grad和theano.tensor.jacobian,我不明白元素操作的导数是如何工作的 这是一个我不明白的MWE: import theano.tensor as T x, y = T.matrices("xy") expr = x**2 + y g

我有一个函数,可以计算三维空间中标量场的值,所以我为它提供了x、y和z坐标的三维张量(由numpy.meshgrid获得),并在任何地方使用元素操作。这正如预期的那样有效

现在我需要计算标量场的梯度。我一直在玩弄
theano.tensor.grad
theano.tensor.jacobian
,我不明白元素操作的导数是如何工作的

这是一个我不明白的MWE:

import theano.tensor as T 

x, y = T.matrices("xy")

expr = x**2 + y
grad = T.grad(expr[0, 0], x)
print(grad.eval({x: [[1, 2], [1, 2]], y: [[1, 1], [2, 2]]}))
它打印

[[ 2.  0.]
 [ 0.  0.]]
当我期待的时候

[[ 2.  4.]
 [ 2.  4.]]
我也试过雅各比:

import theano.tensor as T

x, y = T.matrices("xy")

expr = x**2 + y
grad = T.jacobian(expr.flatten(), x)
print(grad.eval({x: [[1, 2], [1, 2]], y: [[1, 1], [2, 2]]}))
返回

[[[ 2.  0.]
  [ 0.  0.]]

 [[ 0.  4.]
  [ 0.  0.]]

 [[ 0.  0.]
  [ 2.  0.]]

 [[ 0.  0.]
  [ 0.  4.]]]
(非零元素加在一起将给出上一示例中的预期矩阵)

有没有办法得到我需要的elmentwise渐变


例如,我是否可以将函数定义为标量(将三个标量转换为一个标量)并将其元素化应用于坐标张量?这样,导数也将只是一个简单的标量,一切都将顺利进行。

第一个元素
expr[0,0]
作为与
x
相关的成本只与
x
的第一个元素相关,因此您收到的结果是正确的

如果对整个
expr
数组求和,将生成预期结果。Theano将负责通过
sum

import theano.tensor as T 

x, y = T.matrices("xy")

expr = x**2 + y
grad = T.grad(expr.sum(), x)
print(grad.eval({x: [[1, 2], [1, 2]], y: [[1, 1], [2, 2]]}))
印刷品

[[ 2.  4.]
 [ 2.  4.]]

谢谢,这正是我需要的。