gpt4 book ai didi

sparse-matrix - TensorFlow 中是否实现了稀疏张量乘法?

转载 作者:行者123 更新时间:2023-12-03 11:34:46 30 4
gpt4 key购买 nike

稀疏张量与自身或密集张量的乘法在 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 与自身的乘法工作正常。

最佳答案

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

  • 如果您有 tf.SparseTensor和一个 tf.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 运营商可能更合适。 This tutorial讨论何时可以使用嵌入以及如何更详细地调用运算符。
  • 对于由(潜在大且分片的)密集矩阵构成的稀疏矩阵的特殊情况, tf.nn.embedding_lookup_sparse() 可能是合适的。此函数接受一两个 tf.SparseTensor对象,带有 sp_ids表示非零值,以及可选的 sp_weights表示它们的值(否则默认为 1)。
  • 关于sparse-matrix - TensorFlow 中是否实现了稀疏张量乘法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34030140/

    30 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com