gpt4 book ai didi

python - 具有张量函数的 Theano 梯度

转载 作者:行者123 更新时间:2023-11-28 17:27:36 29 4
gpt4 key购买 nike

我有一个计算 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.]]]

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

有什么方法可以得到我需要的 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.]]

关于python - 具有张量函数的 Theano 梯度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37497349/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com