我有一个计算3D空间上标量场的值的函数,因此我为x,y和z坐标(由numpy.meshgrid获得)提供3D张量,并在任何地方使用元素运算。这可以按预期工作。
现在我需要计算标量场的梯度。我一直在玩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.]]
我也尝试过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.]]]
(非零元素一起会给我我前面例子中的预期矩阵)
有没有办法获得我需要的渐变渐变?
我可以举例说明将函数定义为标量(标量中的三个标量)在坐标张量上应用元素吗?这样,衍生物也只是一个简单的标量,一切都会顺利进行。
答案 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.]]