2015-12-01 11 views
13

Pomnażanie rzadkich tensorów ze sobą lub z gęstymi tensorami nie działa w TensorFlow. Poniższy przykładCzy w TensorFlow zaimplementowano rzadkie mnożenie tensorów?

from __future__ import print_function 
import tensorflow as tf 

x = tf.constant([[1.0,2.0], 
       [3.0,4.0]]) 
y = tf.SparseTensor(indices=[[0,0],[1,1]], values=[1.0,1.0], shape=[2,2]) 
z = tf.matmul(x,y) 

sess = tf.Session() 
sess.run(tf.initialize_all_variables()) 
print(sess.run([x, y, z])) 

niepowodzeniem z komunikatem o błędzie

TypeError: Input 'b' of 'MatMul' Op has type string that does not match type 
float32 of argument 'a' 

Oba tensory mają wartości typu float32 widzianych przez ocenę ich bez op mnożenia. Pomnożenie y względem siebie zwraca podobny komunikat o błędzie. Multiplikacja x sama w sobie działa dobrze.

Odpowiedz

18

Mnożenie ogólnego przeznaczenia dla tf.SparseTensor nie jest obecnie zaimplementowane w TensorFlow. Jednak istnieją trzy częściowe rozwiązania, a prawy do wyboru będzie zależeć od charakterystyki danych:

  • Jeśli masz tf.SparseTensor i tf.Tensor, można użyć tf.sparse_tensor_dense_matmul() je pomnożyć. Jest to bardziej wydajne niż następne podejście, jeśli jeden z tensorów jest zbyt duży, aby zmieścić się w pamięci po zagęszczeniu: w dokumentacji podano więcej wskazówek, jak wybierać między tymi dwoma metodami. Zauważ, że akceptuje on argument tf.SparseTensor jako argument najpierw, więc aby rozwiązać twój dokładny problem, musisz użyć argumentów adjoint_a i adjoint_b i przetransponować wynik.

  • Jeśli masz dwie rzadkie tensorów i trzeba je pomnożyć, najprostszy (jeśli nie najbardziej wydajnych) sposobem jest przekształcenie ich do gęsty i używać tf.matmul:

    a = tf.SparseTensor(...) 
    b = tf.SparseTensor(...) 
    
    c = tf.matmul(tf.sparse_tensor_to_dense(a, 0.0), 
           tf.sparse_tensor_to_dense(b, 0.0), 
           a_is_sparse=True, b_is_sparse=True) 
    

    Należy pamiętać, że opcja a_is_sparse i b_is_sparse argumenty oznaczają, że "a (lub b) ma gęstą reprezentację, ale duża liczba jej wpisów wynosi zero", co uruchamia użycie innego algorytmu mnożenia.

  • W tym szczególnym przypadku rzadkiego wektora przez (potencjalnie dużych i sharded) mnożenia zbitą, a wartości w wektorze mają wartość 0 lub 1, operator tf.nn.embedding_lookup mogą być bardziej odpowiednie. This tutorial omawia, kiedy można użyć embeddings i jak wywołać operatora bardziej szczegółowo.

  • W tym szczególnym przypadku rzadkiego matrycy przez (potencjalnie dużych i sharded) gęstej matrycy tf.nn.embedding_lookup_sparse() mogą być odpowiednie. Ta funkcja przyjmuje jeden lub dwa obiekty o wartości sp_ids reprezentujące wartości niezerowe, a opcjonalne sp_weights reprezentujące ich wartości (które w przeciwnym razie są domyślnie ustawione na wartość 1).

+0

Dzięki. To oszczędza mi czasu. – tobe

1

Wydaje się, że

tf.sparse_matmul(
    a, 
    b, 
    transpose_a=None, 
    transpose_b=None, 
    a_is_sparse=None, 
    b_is_sparse=None, 
    name=None 
) 

nie służy do mnożenia dwóch SparseTensors.

a i bTensors nie SparseTensors. I próbowałem tego, to nie działa z SparseTensors.