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)})
@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.
Comentários muito úteis
Sinalizadores
a_is_sparse
eb_is_sparse
não indicam os operandos sendoSparseTensor
s. Em vez disso, eles são dicas algorítmicas para invocar um algoritmo mais eficiente nos dois operandosTensor
densos.Para combinar um SparseTensor e um Tensor denso, você poderia usar
tf.sparse_tensor_dense_matmul()
.