TensorFlow当前未实现tf.SparseTensor
的通用乘法。但是,存在三个部分解决方案,正确的选择方案将取决于数据的特征:
如果您有
tf.SparseTensor
和tf.Tensor
,则可以使用tf.sparse_tensor_dense_matmul()
将它们相乘。如果其中一个张量过大而无法在内存中容纳,则此方法比下一种方法更有效:文档提供了有关如何在这两种方法之间进行决策的更多指导。请注意,它接受tf.SparseTensor
作为第一个参数,因此,要解决您的确切问题,您将需要使用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
表示其值(否则默认为1)。
0
稀疏张量与其自身或密集张量的乘法在TensorFlow中似乎不起作用。下面的例子
失败并显示错误消息
通过在不使用乘法运算的情况下对其进行评估,可以看到两个张量都具有float32类型的值。 y与自身相乘会返回类似的错误消息。 x与自身的乘法效果很好。