Tensorflow: tf.matmul () не работает, когда матрицы разрежены, даже если установлен a_is_sparse. Загадочная ошибка.

Созданный на 9 июл. 2016  ·  3Комментарии  ·  Источник: tensorflow/tensorflow

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

Самый полезный комментарий

Флаги a_is_sparse и b_is_sparse не указывают, что операнды являются SparseTensor s. Вместо этого они представляют собой алгоритмические подсказки для вызова более эффективного алгоритма для двух плотных операндов Tensor .

Чтобы сопоставить SparseTensor и плотный Tensor, вы можете вместо этого использовать tf.sparse_tensor_dense_matmul() .

Все 3 Комментарий

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

Была ли эта страница полезной?
0 / 5 - 0 рейтинги