4

3D 空間でスカラー フィールドの値を計算する関数があるため、x、y、z 座標 (numpy.meshgrid で取得) の 3D テンソルをフィードし、どこでも要素ごとの操作を使用します。これは期待どおりに機能します。

次に、スカラー フィールドの勾配を計算する必要があります。私はtheano.tensor.gradandをいじっていましたが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 グラデーションを取得する方法はありますか?

たとえば、関数をスカラー (スカラーに 3 つのスカラー) として定義して、座標テンソルに要素ごとに適用できますか? このようにして、導関数も単純なスカラーになり、すべてがスムーズに機能します。

4

1 に答える 1

3

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.]]
于 2016-05-28T16:26:19.127 に答える