2017-02-03 5 views
0

나는 벡터 v를 생성하는 정상적인 피드 포워드 네트워크를 가지고있다. 그런 다음 v의 원소는 희소 행렬 M의 0이 아닌 엔트리로 사용된다 (좌표가 미리 정의되어 있다고 가정). 그런 다음 스파 스 매트릭스에 고밀도 벡터가 곱해지고 결과 스칼라에 손실이 정의됩니다. 나는 그 손실을 역 전파시키고 싶다. 네트워크의 가중치는 스파 스 매트릭스를 통과해야합니다.스파 스 텐서를 통해 역 전파 그라디언트?

이것은 희박한 행렬에 대해 매우 합리적인 사용 사례 인 것처럼 보이지만 그러한 기능은 지원되지 않는 것으로 보입니다. 잘못된

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

내가 뭔가를하고 있습니까 아니면이 기능이 (아직?) 존재하지 않는다고 추정에 정정 오전 : 사실, 심지어 전화 tf.gradients (M은, [V]) 오류가 발생합니다? 후자의 경우, 정의 된 그래디언트로 모든 스파 스 텐서 연산을 다시 작성하지 않으면이 특정 사용 사례에 대한 해결 방법이 있습니까?

답변

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 하나 tensorflow/tensorflow/python/framework/sparse_tensor.pyvalue_index이 참조 그것의 정의 파일에

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

아무데도 없다.

인수는 Tensors이며, 아마도 각각 자신의 value_index이 있습니다.

그렇지 않은 경우 SparseTensorIndexedSlices의 대안이며, 여기에도 텐서가 포함되어있는 것처럼 보입니다. tf.gradients

입력은 모든

A `Tensor` or list of tensors 

gradients 정의 파일 SparseTensor에 대한 동등한 _IndexedSlicesToTensor 방법,하지만 아무것도를 가지고 있습니다. 따라서 IndexedSlices (결과가 너무 큰 경우 경고가 표시됨)의 경우 조밀하게 자동 변환되는 것으로 보이지만, SparseTensors은 그렇지 않습니다. 불완전한 개발의 경우 나 불가능하게하는 비 호환성이 있는지 나는 모른다.

1

이에 약간의 변형 작업의 values 직접 SparseTensor의의 기울기 복용을 수행합니다 (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 영업 이익 그라디언트를 정의하기 위해 필자는 (아마도 ref dtypes와 관련이있는) 내가 알아 내지 못한 것을 정의해야한다.