tf.matmul (A, B, a_is_sparse = True) не работает на a = ops.convert_to_tensor (a, name = "a") с загадочной ошибкой.
Пример кода:
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)})
Ошибка:
строка 12, в
_ = sessions.run (tf.matmul (x, y, a_is_sparse = True), feed_dict = {
Файл "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/math_ops.py", строка 1189, в matmul
a = ops.convert_to_tensor (a, name = "a")
Файл "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/ops.py", строка 620, в convert_to_tensor
ret = конверсионная функция (значение, dtype = dtype, name = name, as_ref = as_ref)
Файл "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", строка 179, в _constant_tensor_conversion_function
возвращаемая константа (v, dtype = dtype, name = name)
Файл "/usr/local/lib/python2.7/site-packages/tensorflow/python/ops/constant_op.py", строка 162, в константе
tensor_util.make_tensor_proto (значение, dtype = dtype, shape = shape))
Файл "/usr/local/lib/python2.7/site-packages/tensorflow/python/framework/tensor_util.py", строка 421, в make_tensor_proto
tenor_proto.string_val.extend ([compat.as_bytes (x) для x в proto_values])
Файл "/usr/local/lib/python2.7/site-packages/tensorflow/python/util/compat.py", строка 44, в as_bytes
Raise TypeError ('Ожидаемая двоичная строка или строка Unicode, получено% r'% bytes_or_text)
TypeError: ожидаемая двоичная строка или строка Unicode, получено
Исправлено явным преобразованием разреженного тензора в плотный перед умножением:
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 , это должно сработать, или это известное ограничение разреженных тензоров.
Флаги a_is_sparse
и b_is_sparse
не указывают, что операнды являются SparseTensor
s. Вместо этого они представляют собой алгоритмические подсказки для вызова более эффективного алгоритма для двух плотных операндов Tensor
.
Чтобы сопоставить SparseTensor и плотный Tensor, вы можете вместо этого использовать tf.sparse_tensor_dense_matmul()
.
Флаги a_is_sparse и b_is_sparse не указывают, что операнды являются SparseTensors. Вместо этого они представляют собой алгоритмические подсказки для вызова более эффективного алгоритма для двух плотных тензорных операндов.
Это должно быть частью документации matmut. Непонятно, что делает флаг a_is_sparse
.
Самый полезный комментарий
Флаги
a_is_sparse
иb_is_sparse
не указывают, что операнды являютсяSparseTensor
s. Вместо этого они представляют собой алгоритмические подсказки для вызова более эффективного алгоритма для двух плотных операндовTensor
.Чтобы сопоставить SparseTensor и плотный Tensor, вы можете вместо этого использовать
tf.sparse_tensor_dense_matmul()
.