Tensorflow批处理稀疏乘法

Tensorflow批处理稀疏乘法,tensorflow,sparse-matrix,Tensorflow,Sparse Matrix,我想用一个稠密张量乘以一个稀疏张量,但要在一个批次内完成 例如,我有一个稀疏张量,对应的密集形状为(206553665536),其中20是批量大小。我想将批次中的每个(6553665536)与具有密集表示的张量形状(2065536)中相应的(65536x1)相乘tf.sparse\u tensor\u densite\u matmul只接受秩2稀疏张量。有没有一种方法可以对一批产品执行此操作 由于内存限制,我希望尽可能避免将稀疏矩阵转换为稠密矩阵。答案很简单-首先重塑稀疏张量,然后将其乘以稠密矩

我想用一个稠密张量乘以一个稀疏张量,但要在一个批次内完成

例如,我有一个稀疏张量,对应的密集形状为(206553665536),其中20是批量大小。我想将批次中的每个(6553665536)与具有密集表示的张量形状(2065536)中相应的(65536x1)相乘
tf.sparse\u tensor\u densite\u matmul
只接受秩2稀疏张量。有没有一种方法可以对一批产品执行此操作


由于内存限制,我希望尽可能避免将稀疏矩阵转换为稠密矩阵。

答案很简单-首先重塑稀疏张量,然后将其乘以稠密矩阵。类似这样的方法会奏效:

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

假设
a
是具有形状
(206553665536)
的稀疏张量,
b
是具有形状
(2065536)
的密集张量,则可以按如下方式执行批稀疏密集矩阵乘法:

y_sparse = tf.sparse.reduce_sum_sparse(a * b[:, None, :], axis=-1)
此解决方案扩展了张量
b
的第二维度,以启用隐式广播。然后,通过沿最后一个轴执行稀疏密集乘法和稀疏求和来进行批量矩阵乘法

如果
b
有一个第三维度,因此它是一批矩阵,您可以单独乘以它们的列,然后将它们连接起来:

multipled_dims=[]
对于范围内的i(b.形状[-1]):
相乘的\u dims.append(tf.expand\u dims(tf.sparse.reduce\u sum(a*b[:,:,i][:,None,:],axis=-1),-1))
结果=tf.concat(乘以-1)

你能澄清一下为什么这会起作用并在乘法后将代码扩展到零吗?我想你误解了这个问题,因为
b
的形状是
(2065536,1)
哦,对不起,我刚才在答案中输入了
b
的形状(我现在已经更新了)-代码应按预期工作当我运行此代码时,我得到
y\u sparse=tf.sparse.reduce\u sum(a*b[,None,:],axis=-1)类型错误:列表索引必须是整数或切片,而不是元组。我使用TF2.0,所以没有reduce\u sum\u sparse。编辑:我的错误是在测试时忘了将数组转换为tf.Variable。您能解释一下,如果我有形状为b(2065536,3)的数组,我如何扩展它吗?很遗憾,我恐怕不可能有形状为b(2065536,3)
(2065536,3),因为广播只支持从密集到稀疏。但是,您可以单独执行三个矩阵乘法,然后沿最后一个轴连接结果。