2016-06-27 53 views
2

Tensorflowのパラメータ行列 "X"に対してテンソル "Y"のグラジエントを計算したいとします。具体的には、与えられた "インデックス"の "X"の集合に対してのみグラデーションを計算したいと思います。Tensorflowの "tf.gather"と "tf.gradients"を併用する

Y=some_function_of_X 
grad=tf.gradients(Y,X) 
grads_i_want_to_compute=tf.gather(grad,indices) 

Tensorflowの「tf.scatter_sub」を使用し、私はその後に基づくパラメータ行列「X」の所望のインデックスを更新することができる:次のコードは、所望のインデックスに対応するそれらの勾配を返し、その後、最初の全体勾配を計算します勾配降下:

tf.scatter_sub(X,indices,learning_rate*grads_i_want_to_compute) 

これは適切に機能しますが、最終的にはすべての勾配が計算されます。処理速度のために、私はすべての勾配を計算したくありません。だから私はこれを試した:

Y=some_function_of_X 
sparse_X=tf.gather(X,indices) 
grads_i_want_to_compute = tf.gradient(Y,sparse_X) 
tf.scatter_sub(X,indices,learning_rate*grads_i_want_to_compute) 

後者では、 "tf.gradient"は "None"オブジェクトを返すので処理を続行できません。誰もこの問題を解決する方法を知っていますか?

答えて

0
あなたはその後、

Y = F(tf.concat(list_of_X_i、...))

はその後、計算勾配を計算する小さなテンソルのセットにXを分割しようとすることができ

w.r.t.あなたが気にしているそれぞれのX_i。あなたがしようとしていることは実用的ではないかもしれません。

ネットワークの深さと構造によっては、Xの単一要素の勾配が、上のレイヤーからの勾配の多く(またはすべて)に依存する場合があります。だから、ブルートフォースアプローチに比べて計算量を大幅に節約することはできません。

1

この作業を行うには、Xの関数ではなく、sparse_Xの関数であるYが必要です。

関連する問題