sparse-matrix tensorflow

sparse matrix - ¿Se implementa la multiplicación de tensor dispersos en TensorFlow?



sparse-matrix (4)

La multiplicación de propósito general para tf.SparseTensor no se implementa actualmente en TensorFlow. Sin embargo, hay tres soluciones parciales, y la correcta para elegir dependerá de las características de sus datos:

  • Si tiene un tf.SparseTensor y un tf.Tensor , puede usar tf.sparse_tensor_dense_matmul() para multiplicarlos. Esto es más eficiente que el siguiente enfoque si uno de los tensores es demasiado grande para caber en la memoria cuando está densificado: la documentación tiene más información sobre cómo decidir entre estos dos métodos. Tenga en cuenta que acepta un tf.SparseTensor como primer argumento, por lo que para resolver su problema exacto, deberá usar los argumentos adjoint_a y adjoint_b , y transponer el resultado.

  • Si tiene dos tensores dispersos y necesita multiplicarlos, la forma más sencilla (si no la más tf.matmul ) es convertirlos en densos y usar 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)

    Tenga en cuenta que los a_is_sparse opcionales a_is_sparse y b_is_sparse significan que " a (o b ) tiene una representación densa pero un gran número de sus entradas son cero", lo que activa el uso de un algoritmo de multiplicación diferente.

  • Para el caso especial de vector disperso por multiplicación de matriz densa (potencialmente grande y fragmentada), y los valores en el vector son 0 o 1, el operador tf.nn.embedding_lookup puede ser más apropiado. Este tutorial explica cuándo puede utilizar incrustaciones y cómo invocar al operador con más detalle.

  • Para el caso especial de matriz dispersa por matriz densa (potencialmente grande y fragmentada), tf.nn.embedding_lookup_sparse() puede ser apropiado. Esta función acepta uno o dos objetos tf.SparseTensor , con sp_ids representan los valores que no son cero, y los sp_weights opcionales que representan sus valores (que de otro modo se establecen de forma predeterminada en uno).

La multiplicación de tensores dispersos entre sí o con tensores densos no parece funcionar en TensorFlow. El siguiente ejemplo

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]))

falla con el mensaje de error

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

Ambos tensores tienen valores del tipo float32 como se ve al evaluarlos sin la operación de multiplicación. La multiplicación de y consigo devuelve un mensaje de error similar. Multipication de x consigo mismo funciona bien.



Parece que

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

No es para la multiplicación de dos SparseTensors .

a y b son Tensors no SparseTensors . Y lo he intentado, no funciona con SparseTensors .