4

我有一个函数可以计算 3D 空间上的标量字段的值,所以我为它提供 x、y 和 z 坐标的 3D 张量(由 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.]]]

(非零元素加在一起会给我上一个示例中的预期矩阵)

有什么方法可以获得我需要的元素渐变吗?

例如,我可以以某种方式将函数定义为标量(三个标量为一个标量)将其逐元素应用于坐标张量吗?这样,导数也只是一个简单的标量,一切都会顺利进行。

4

1 回答 1

3

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.]]
于 2016-05-28T16:26:19.127 回答