要素ごとのグラデーションを実行しようとしています
例えば、
output-f(x): 5 x 1 ベクトル、
入力 X に関して: 5 x 1 ベクトル
私はこれを次のように行うことができます、
import theano
import theano.tensor as T
X = T.vector('X')
f = X*3
[rfrx, []] = theano.scan(lambda j, f,X : T.grad(f[j], X), sequences=T.arange(X.shape[0]), non_sequences=[f,X])
fcn_rfrx = theano.function([X], rfrx)
fcn_rfrx(np.ones(5,).astype(float32))
結果は
array([[ 3., 0., 0., 0., 0.],
[ 0., 3., 0., 0., 0.],
[ 0., 0., 3., 0., 0.],
[ 0., 0., 0., 3., 0.],
[ 0., 0., 0., 0., 3.]], dtype=float32)
しかし効率が悪いので、結果として5×1のベクトルを取得したい
のようなことをすることによって..
[rfrx, []] = theano.scan(lambda j, f,X : T.grad(f[j], X[j]), sequences=T.arange(X.shape[0]), non_sequences=[f,X])
これは機能しません。
これを行う方法はありますか?(形式が悪くてすみません..私はここに新しく、学習しています)
(より明確な例を追加しました):
指定された入力ベクトル: x[1]、x[2]、...、x[n]
および出力ベクトル: y[1]、y[2]、..、y[n]、
ここで、y[i] = f(x[i]) です。
の結果が欲しい
df(x[i])/dx[i] のみ
ではなく
df(x[i])/dx[j] for (i<>j)
、計算効率のため (n はデータ数 > 10000)