Python 带张量函数的Theano梯度
我有一个函数,可以计算三维空间中标量场的值,所以我为它提供了x、y和z坐标的三维张量(由numpy.meshgrid获得),并在任何地方使用元素操作。这正如预期的那样有效 现在我需要计算标量场的梯度。我一直在玩弄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
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.]]
谢谢,这正是我需要的。