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 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.SparseTensor
como primer argumento, por lo que para resolver su problema exacto, deberá usar los argumentosadjoint_a
yadjoint_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_sparse
opcionalesa_is_sparse
yb_is_sparse
significan 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_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 objetostf.SparseTensor
, consp_ids
representan los valores que no son cero, y lossp_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.
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