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.SparseTensory untf.Tensor, puede usartf.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 untf.SparseTensorcomo primer argumento, por lo que para resolver su problema exacto, deberá usar los argumentosadjoint_ayadjoint_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 usartf.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_sparseopcionalesa_is_sparseyb_is_sparsesignifican que "a(ob) 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_lookuppuede 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 objetostf.SparseTensor, consp_idsrepresentan los valores que no son cero, y lossp_weightsopcionales 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.
Para que la respuesta sea más completa:
tf.sparse_matmul(
a,
b,
transpose_a=None,
transpose_b=None,
a_is_sparse=None,
b_is_sparse=None,
name=None
)
existe también:
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 .
Recientemente, se tf.sparse_tensor_dense_matmul(...) que permite multiplicar una matriz dispersa por una matriz densa.
https://www.tensorflow.org/versions/r0.9/api_docs/python/sparse_ops.html#sparse_tensor_dense_matmul