【问题标题】:Tensorflow batch sparse multiplyTensorflow 批量稀疏乘法
【发布时间】:2018-07-19 16:58:31
【问题描述】:

我想将稀疏张量乘以密集张量,但要在批次内进行。

例如,我有一个稀疏张量,其对应的密集形状为 (20,65536,65536),其中 20 是批量大小。我想将批次中的每个 (65536,65536) 与具有密集表示的张量形状 (20,65536) 中的相应 (65536x1) 相乘。 tf.sparse_tensor_dense_matmul 只接受 2 阶稀疏张量。有没有办法批量执行此操作?

由于内存限制,如果可能,我想避免将稀疏矩阵转换为密集矩阵。

【问题讨论】:

    标签: tensorflow sparse-matrix


    【解决方案1】:

    假设a 是形状为(20, 65536, 65536) 的稀疏张量,而b 是形状为(20, 65536) 的稠密张量,您可以按如下方式执行批量稀疏-密集矩阵乘法:

    y_sparse = tf.sparse.reduce_sum_sparse(a * b[:, None, :], axis=-1)
    

    这个解决方案扩展了张量b 的第二个维度以启用隐式广播。然后,通过执行稀疏密集乘法和沿最后一个轴的稀疏求和来进行批量矩阵乘法。

    如果b 有第三维,所以它是一组矩阵,您可以将它们的列单独相乘,然后再将它们连接起来:

    multiplied_dims = []
    for i in range (b.shape[-1]):
      multiplied_dims.append(tf.expand_dims(tf.sparse.reduce_sum(a * b[:, :, i][:, None, :], axis=-1), -1))
    result = tf.concat(multiplied_dims, -1)
    

    【讨论】:

    • 我想你误解了这个问题,因为b 的形状是(20, 65536, 1)
    • 哦,对不起,我在答案中打错了b 的形状(我现在已经更新了)- 代码应该可以正常工作
    • 当我运行这段代码时,我得到y_sparse = tf.sparse.reduce_sum(a * b[:, None, :], axis=-1) TypeError: list indices must be integers or slices, not tuple。我使用 tf 2.0,所以没有 reduce_sum_sparse。编辑:我的错误忘记在测试时将数组转换为 tf.Variable。
    • 如果我的形状为 (20,65536,3),您能解释一下如何扩展它吗?
    • 恐怕不可能有形状为(20,65536,3)b,因为不幸的是,广播只支持从密集到稀疏。但是,您可以独立执行三个矩阵乘法,然后沿最后一个轴连接结果。
    【解决方案2】:

    答案很简单——首先重塑稀疏张量,然后将其乘以密集矩阵。这样的事情会起作用:

    sparse_tensor_rank2 = tf.sparse_reshape(sparse_tensor, [-1, 65536])
    

    【讨论】:

    • 能否请您澄清一下为什么这会起作用并在乘法之后展开代码?
    猜你喜欢
    • 2017-12-03
    • 2016-03-05
    • 1970-01-01
    • 1970-01-01
    • 2020-08-11
    • 2020-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多