Подтвердить что ты не робот

Разнообразное умножение тензоров реализовано в TensorFlow?

Умножение разреженных тензоров с самим собой или с плотными тензорами, похоже, не работает в TensorFlow. Следующий пример

from __future__ import print_function
import tensorflow as tf

x = tf.constant([[1.0,2.0],
                 [3.0,4.0]])
y = tf.SparseTensor(indices=[[0,0],[1,1]], values=[1.0,1.0], shape=[2,2])
z = tf.matmul(x,y)

sess = tf.Session()
sess.run(tf.initialize_all_variables())
print(sess.run([x, y, z]))

с сообщением об ошибке

TypeError: Input 'b' of 'MatMul' Op has type string that does not match type 
float32 of argument 'a'

Оба тензора имеют значения типа float32, как видно, оценивая их без умножения op. Умножение y с собой возвращает аналогичное сообщение об ошибке. Мультипликация x с собой отлично работает.

4b9b3361

Ответ 1

Универсальное умножение для tf.SparseTensor в настоящее время не реализовано в TensorFlow. Однако есть три частичных решения, и правильный выбор будет зависеть от характеристик ваших данных:

  • Если у вас есть tf.SparseTensor и tf.Tensor, вы можете использовать tf.sparse_tensor_dense_matmul(), чтобы их умножить. Это более эффективно, чем следующий подход, если один из тензоров слишком велик, чтобы поместиться в память при уплотнении: в документации есть больше указаний относительно того, как выбирать между этими двумя методами. Обратите внимание, что он принимает tf.SparseTensor как аргумент first, поэтому для решения вашей конкретной проблемы вам нужно будет использовать аргументы adjoint_a и adjoint_b и перенести результат.

  • Если у вас есть два разреженных тензора и их необходимо умножить, самый простой (если не самый эффективный) способ состоит в том, чтобы преобразовать их в плотные и использовать tf.matmul:

    a = tf.SparseTensor(...)
    b = tf.SparseTensor(...)
    
    c = tf.matmul(tf.sparse_tensor_to_dense(a, 0.0),
                  tf.sparse_tensor_to_dense(b, 0.0),
                  a_is_sparse=True, b_is_sparse=True)
    

    Обратите внимание, что необязательные аргументы a_is_sparse и b_is_sparse означают, что "a (или b) имеет плотное представление, но большое количество его записей равно нулю", что запускает использование другого умножения алгоритм.

  • Для частного случая разреженного вектора путем (умножаемого и масштабированного) плотного матричного умножения, а значения в векторе равны 0 или 1, tf.nn.embedding_lookup может быть более уместным. В этом руководстве обсуждается, когда вы можете использовать вложения и как вызвать оператора более подробно.

  • Для частного случая с разреженной матрицей (потенциально большой и очерченной) плотной матрицей tf.nn.embedding_lookup_sparse() может быть уместным. Эта функция принимает один или два объекта tf.SparseTensor с sp_ids, представляющим ненулевые значения, и необязательный sp_weights, представляющий их значения (которые в противном случае по умолчанию равны одному).

Ответ 3

Кажется, что

tf.sparse_matmul(
    a,
    b,
    transpose_a=None,
    transpose_b=None,
    a_is_sparse=None,
    b_is_sparse=None,
    name=None
)

не для умножения двух SparseTensors.

a и b являются Tensors not SparseTensors. И я пробовал это, он не работает с SparseTensors.

Ответ 5

tf.sparse_matmul предназначен для умножения двух плотных тензорных, не разреженных структур данных. Эта функция - просто оптимизированная версия тензорного умножения, если данная матрица (или обе матрицы) имеют много нулевых значений. Опять же, он не принимает разреженный тензорный тип данных. Он принимает плотный тензорный тип данных. Это может ускорить ваши расчеты, если значения в основном равны нулю.

Насколько я знаю, не существует реализации тензорного умножения двух разреженных типов. но только один разреженный плотный, который является tf.sparse_tensor_dense_matmul (x, y)!