tf.matmul(A, B, a_is_sparse=True) échoue sur a = ops.convert_to_tensor(a, name="a") avec une erreur cryptique.
Exemple de code :
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)})
Erreur:
ligne 12, dans
_ = sess.run(tf.matmul(x, y, a_is_sparse=True), feed_dict={
Fichier "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", ligne 1189, dans matmul
a = ops.convert_to_tensor(a, name="a")
Fichier "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", ligne 620, dans convert_to_tensor
ret = conversion_func(valeur, dtype=dtype, nom=nom, as_ref=as_ref)
Fichier "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", ligne 179, dans _constant_tensor_conversion_function
return constant(v, dtype=dtype, name=name)
Fichier "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", ligne 162, en constante
tensor_util.make_tensor_proto(valeur, dtype=dtype, forme=forme))
Fichier "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", ligne 421, dans make_tensor_proto
tensor_proto.string_val.extend([compat.as_bytes(x) for x in proto_values])
Fichier "/usr/local/lib/python2.7/site-packages/tensorflow/python/util/compat.py", ligne 44, en as_bytes
raise TypeError('Chaîne binaire ou unicode attendue, a obtenu %r' % bytes_or_text)
TypeError : chaîne binaire ou unicode attendue, obtenu
Est corrigé en convertissant explicitement le tenseur clairsemé en tenseur dense avant la multiplication :
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 , Est-ce que cela devrait fonctionner, ou s'agit-il d'une limitation connue des tenseurs clairsemés.
Les drapeaux a_is_sparse
et b_is_sparse
n'indiquent pas que les opérandes sont des SparseTensor
s. Au lieu de cela, ce sont des astuces algorithmiques pour invoquer un algorithme plus efficace sur les deux opérandes denses Tensor
.
Pour matmuler un SparseTensor et un Tensor dense, vous pouvez utiliser tf.sparse_tensor_dense_matmul()
place.
Les drapeaux a_is_sparse et b_is_sparse n'indiquent pas que les opérandes sont SparseTensors. Au lieu de cela, ce sont des astuces algorithmiques pour invoquer un algorithme plus efficace sur les deux opérandes Tensor denses.
Cela devrait faire partie de la documentation de matmut. On ne sait pas très bien à quoi sert le drapeau a_is_sparse
.
Commentaire le plus utile
Les drapeaux
a_is_sparse
etb_is_sparse
n'indiquent pas que les opérandes sont desSparseTensor
s. Au lieu de cela, ce sont des astuces algorithmiques pour invoquer un algorithme plus efficace sur les deux opérandes densesTensor
.Pour matmuler un SparseTensor et un Tensor dense, vous pouvez utiliser
tf.sparse_tensor_dense_matmul()
place.