Tensorflow: tf.matmul () falla cuando las matrices son escasas, incluso si se establece a_is_sparse. Error críptico.

Creado en 9 jul. 2016  ·  3Comentarios  ·  Fuente: tensorflow/tensorflow

tf.matmul (A, B, a_is_sparse = True) falla en a = ops.convert_to_tensor (a, name = "a") con un error críptico.

Código de ejemplo:

import tensorflow as tf
import numpy as np

x = tf.sparse_placeholder(tf.float32)
y = tf.Variable(tf.random_uniform([9, 9], minval=0.0, maxval=1.0, dtype=tf.float32))

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    indices = np.array([[3, 2], [4, 5]], dtype=np.int64)
    values = np.array([1.0, 2.0], dtype=np.float32)
    shape = np.array([9, 9], dtype=np.int64)
    _ = sess.run(tf.matmul(x, y), feed_dict={
        x: tf.SparseTensorValue(indices, values, shape)})

Error:
línea 12, en
_ = sess.run (tf.matmul (x, y, a_is_sparse = True), feed_dict = {
Archivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", línea 1189, en matmul
a = ops.convert_to_tensor (a, name = "a")
Archivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", línea 620, en convert_to_tensor
ret = conversion_func (valor, dtype = dtype, name = name, as_ref = as_ref)
Archivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", línea 179, en _constant_tensor_conversion_function
return constante (v, dtype = dtype, name = name)
Archivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", línea 162, en constante
tensor_util.make_tensor_proto (valor, dtype = dtype, shape = shape))
Archivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", línea 421, en make_tensor_proto
tensor_proto.string_val.extend ([compat.as_bytes (x) para x en proto_values])
Archivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/util/compat.py", línea 44, en as_bytes
raise TypeError ('Cadena binaria o Unicode esperada, obtuvo% r'% bytes_or_text)
TypeError: cadena binaria o Unicode esperada, obtenida

Se corrige convirtiendo explícitamente de tensor escaso a denso antes de la multiplicación:

import tensorflow as tf
import numpy as np

x = tf.sparse_placeholder(tf.float32)
z = tf.sparse_tensor_to_dense(x)
y = tf.Variable(tf.random_uniform([9, 9], minval=0.0, maxval=1.0, dtype=tf.float32))

with tf.Session() as sess:
    sess.run(tf.initialize_all_variables())
    indices = np.array([[3, 2], [4, 5]], dtype=np.int64)
    values = np.array([1.0, 2.0], dtype=np.float32)
    shape = np.array([9, 9], dtype=np.int64)
    _ = sess.run(tf.matmul(z, y), feed_dict={
        x: tf.SparseTensorValue(indices, values, shape)})

Comentario más útil

Las banderas a_is_sparse y b_is_sparse no indican que los operandos sean SparseTensor s. En cambio, son sugerencias algorítmicas para invocar un algoritmo más eficiente en los dos operandos densos Tensor .

Para combinar un SparseTensor y un Tensor denso, puedes usar tf.sparse_tensor_dense_matmul() lugar.

Todos 3 comentarios

@concretevitamin , ¿se espera que funcione o es una limitación conocida de los tensores escasos?

Las banderas a_is_sparse y b_is_sparse no indican que los operandos sean SparseTensor s. En cambio, son sugerencias algorítmicas para invocar un algoritmo más eficiente en los dos operandos densos Tensor .

Para combinar un SparseTensor y un Tensor denso, puedes usar tf.sparse_tensor_dense_matmul() lugar.

Los indicadores a_is_sparse y b_is_sparse no indican que los operandos sean SparseTensors. En cambio, son sugerencias algorítmicas para invocar un algoritmo más eficiente en los dos operandos tensores densos.

Esto debería ser parte de la documentación de matmut. No está muy claro qué hace la bandera a_is_sparse .

¿Fue útil esta página
0 / 5 - 0 calificaciones