Tensorflow: tf.matmul() échoue lorsque les matrices sont creuses, même si a_is_sparse est défini. Erreur cryptique.

Créé le 9 juil. 2016  ·  3Commentaires  ·  Source: tensorflow/tensorflow

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

Commentaire le plus utile

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.

Tous les 3 commentaires

@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 .

Cette page vous a été utile?
0 / 5 - 0 notes