我有一个函数可以计算 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.]]]
(非零元素加在一起会给我上一个示例中的预期矩阵)
有什么方法可以获得我需要的元素渐变吗?
例如,我可以以某种方式将函数定义为标量(三个标量为一个标量)将其逐元素应用于坐标张量吗?这样,导数也只是一个简单的标量,一切都会顺利进行。