具有张量函数的Theano梯度

时间:2016-05-28 09:27:32

标签: python theano differentiation

我有一个计算3D空间上标量场的值的函数,因此我为x,y和z坐标(由numpy.meshgrid获得)提供3D张量,并在任何地方使用元素运算。这可以按预期工作。

现在我需要计算标量场的梯度。我一直在玩theano.tensor.gradtheano.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.]]

我也尝试过jacobian:

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.]]]

(非零元素一起会给我我前面例子中的预期矩阵)

有没有办法获得我需要的渐变渐变?

我可以举例说明将函数定义为标量(标量中的三个标量)在坐标张量上应用元素吗?这样,衍生物也只是一个简单的标量,一切都会顺利进行。

1 个答案:

答案 0 :(得分:2)

作为与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.]]