TensorFlow是否实现了稀疏张量乘法?
tensorflow
13
0

稀疏张量与其自身或密集张量的乘法在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类型的值。 y与自身相乘会返回类似的错误消息。 x与自身的乘法效果很好。

参考资料:
Stack Overflow
收藏
评论
共 3 个回答
高赞 时间 活跃

TensorFlow当前未实现tf.SparseTensor的通用乘法。但是,存在三个部分解决方案,正确的选择方案将取决于数据的特征:

  • 如果您有tf.SparseTensortf.Tensor ,则可以使用tf.sparse_tensor_dense_matmul()将它们相乘。如果其中一个张量过大而无法在内存中容纳,则此方法比下一种方法更有效:文档提供了有关如何在这两种方法之间进行决策的更多指导。请注意,它接受tf.SparseTensor作为第一个参数,因此,要解决您的确切问题,您将需要使用adjoint_aadjoint_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_sparseb_is_sparse参数意味着“ a (或b )具有密集表示,但其大量条目为零”,这触发了使用不同的乘法算法。

  • 对于通过(可能较大且分片的)密集矩阵乘法来稀疏向量的特殊情况,并且向量中的值为0或1,则tf.nn.embedding_lookup运算符可能更合适。 本教程讨论了何时可以使用嵌入以及如何更详细地调用运算符。

  • 对于通过(可能较大且分片的)密集矩阵进行稀疏矩阵的特殊情况, tf.nn.embedding_lookup_sparse()可能是合适的。此函数接受一个或两个tf.SparseTensor对象,其中sp_ids表示非零值,而可选的sp_weights表示其值(否则默认为1)。

收藏
评论

最近,添加了tf.sparse_tensor_dense_matmul(...) ,允许将稀疏矩阵乘以稠密矩阵。

https://www.tensorflow.org/versions/r0.9/api_docs/python/sparse_ops.html#sparse_tensor_dense_matmul

https://github.com/tensorflow/tensorflow/issues/1241

收藏
评论

看起来

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

不是用于两个SparseTensors乘法。

abTensors而不是SparseTensors 。我已经尝试过,它不能与SparseTensors一起使用。

收藏
评论
新手导航
  • 社区规范
  • 提出问题
  • 进行投票
  • 个人资料
  • 优化问题
  • 回答问题