2017-02-03 14 views
0

私は、ベクトルvを生成する通常のフィードフォワードネットワークを持っています。次に、vの要素は、疎行列Mの非ゼロエントリーとして使用されます(座標はあらかじめ定義されているものとします)。その後、疎な行列に密なベクトルが乗算され、結果のスカラーに損失が定義されます。私は損失w.r.tを逆伝播したい。ネットワークの重みは、疎な行列を通過する必要があります。スパーステンソルによる後方伝播勾配?

これはまれな行列の完全に妥当なユースケースのようですが、このような機能はサポートされていないようです。確かに、でもtf.gradientsを呼び出すと(M、[V])エラーが発生します。

AttributeError: 'SparseTensor' object has no attribute 'value_index'

は、私が何か間違ったことをやっているか、私はこの機能は(まだ?)が存在しないことを前提に訂正していますか?後者の場合、定義された勾配でスパーステンソル演算のすべてを書き換えるこの特定のユースケースでは回避策がありますか?

答えて

0

私は暗闇の中でここで釣りをしています。コードとドキュメントで作業していますが、経験はありません。

Tensorクラスの作成者は、次のとおりです。

def __init__(self, op, value_index, dtype): 
    # value_index: An `int`. Index of the operation's endpoint that produces this tensor. 

value_indexTensor名前を生成するために使用されます。

SparseTensor 1はtensorflow/tensorflow/python/framework/sparse_tensor.pyvalue_indexが参照されていることの定義ファイルに

def __init__(self, indices, values, dense_shape): 

どこにもありません。

引数はTensorsで、おそらくそれぞれ独自のvalue_indexが付いています。

これ以外の場合、SparseTensorはテンソルを含むIndexedSlicesの代替品であるように見えます。 tf.gradients

入力はすべて

A `Tensor` or list of tensors 

gradients定義ファイルがSparseTensorの等価_IndexedSlicesToTensor方法が、何を持っています。したがって、IndexedSlices(結果が大きすぎると警告が表示されます)の場合は密な自動変換があるようですが、SparseTensorsではそうではありません。私はそれが不完全な開発の場合、またはそれを不可能にする互換性がないかどうかはわかりません。

1

この上のわずかな変動は直接SparseTensorvaluesの勾配とる、作業を行う:(TensorFlow 0.12.1オン)

import tensorflow as tf 
sparse_values = tf.identity(tf.Variable(tf.constant([1., 2., 3.]))) 
sparse_indices = tf.constant([[0, 0], [1, 1], [2, 2]], dtype=tf.int64) 
sparse_matrix = tf.SparseTensor(sparse_indices, sparse_values, [3, 3]) 
multiplied = tf.sparse_tensor_dense_matmul(sparse_matrix, tf.eye(3)) 
loss = tf.reduce_sum(multiplied) 
gradients = tf.gradients(loss, [sparse_values]) 
with tf.Session() as session: 
    tf.global_variables_initializer().run() 
    print(session.run(gradients)) 

プリント:

[array([ 1., 1., 1.], dtype=float32)] 

なぜtf.identity OPをグラデーションを定義するためには、私はまだ分かっていない(おそらく何かを参照dtypesと関係がある)必要があります。