Tensorflow: tf.matmul () falha quando as matrizes são esparsas, mesmo se a_is_sparse estiver definido. Erro criptográfico.

Criado em 9 jul. 2016  ·  3Comentários  ·  Fonte: tensorflow/tensorflow

tf.matmul (A, B, a_is_sparse = True) falha em a = ops.convert_to_tensor (a, name = "a") com erro críptico.

Código de exemplo:

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

Erro:
linha 12, em
_ = sess.run (tf.matmul (x, y, a_is_sparse = True), feed_dict = {
Arquivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", linha 1189, em matmul
a = ops.convert_to_tensor (a, name = "a")
Arquivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", linha 620, em convert_to_tensor
ret = conversion_func (valor, dtype = dtype, name = name, as_ref = as_ref)
Arquivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", linha 179, em _constant_tensor_conversion_function
retornar constante (v, dtype = dtype, name = name)
Arquivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", linha 162, em constante
tensor_util.make_tensor_proto (value, dtype = dtype, shape = shape))
Arquivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", linha 421, em make_tensor_proto
tensor_proto.string_val.extend ([compat.as_bytes (x) para x em proto_values])
Arquivo "/usr/local/lib/python2.7/site-packages/tensorflow/python/util/compat.py", linha 44, em as_bytes
raise TypeError ('Esperada string binária ou unicode, obtida% r'% bytes_or_text)
TypeError: string binária ou unicode esperada, obtida

É corrigido convertendo explicitamente de tensor esparso para denso antes da multiplicação:

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

Comentários muito úteis

Sinalizadores a_is_sparse e b_is_sparse não indicam os operandos sendo SparseTensor s. Em vez disso, eles são dicas algorítmicas para invocar um algoritmo mais eficiente nos dois operandos Tensor densos.

Para combinar um SparseTensor e um Tensor denso, você poderia usar tf.sparse_tensor_dense_matmul() .

Todos 3 comentários

@concretevitamin , espera-se que funcione ou é uma limitação conhecida dos tensores esparsos.

Sinalizadores a_is_sparse e b_is_sparse não indicam os operandos sendo SparseTensor s. Em vez disso, eles são dicas algorítmicas para invocar um algoritmo mais eficiente nos dois operandos Tensor densos.

Para combinar um SparseTensor e um Tensor denso, você poderia usar tf.sparse_tensor_dense_matmul() .

Os sinalizadores a_is_sparse e b_is_sparse não indicam que os operandos são SparseTensors. Em vez disso, eles são dicas algorítmicas para invocar um algoritmo mais eficiente nos dois operandos tensores densos.

Isso deve fazer parte da documentação do matmut. Não está claro o que a bandeira a_is_sparse faz.

Esta página foi útil?
0 / 5 - 0 avaliações