如何在TensorFlow2.0中实现稀疏矩阵与3D张量的张量乘法?

问题描述 投票:0回答:1

我有一个形状为 (60400, 32600) 的稀疏矩阵 A 和一个形状为 (32600, 60400, 64) 的 3D 张量 B。我想要做的是将 A 和 B 相乘以获得形状为 (60400, 60400, 64) 的张量 C,然后生成形状为 (60400, 64) 的最终张量,其中具有 C 的对角线元素。

我尝试 tf.sparse.sparse_dense_matmul(A, B) 首先获取张量 C,但我得到了 ValueError: Shape Must be rating 2 but isrank 3.

然后我使用 tf.einsum('ij, jik->ik', A, B) 但出现 TypeError: Tensors in list Passed to 'inputs' of 'Einsum' Op has types [NOT CONVERTIBLE TO TENSOR, float32]并不全部匹配。我认为这是因为 A 是一个稀疏矩阵,但我无法将 A 从稀疏矩阵转换为稠密矩阵。

对此有什么想法吗?我将不胜感激。

tensorflow2.0 sparse-matrix matrix-multiplication einsum
1个回答
0
投票

我无法直接帮助您进行 Tensorflow 计算,但可以根据

numpy
scipy.sparse
进行一些观察。

scipy.sparse
矩阵仅限于 2d。最近的版本制作了稀疏数组,但它们仍然仅限于 2d。

稀疏 2d

matmul
与密集也仅限于 2d 密集数组。结果本身就是密集的。只有稀疏与稀疏才会产生稀疏结果。因此,即使稀疏与 3d 稠密一起工作,(60400, 60400, 64) 对于稠密张量来说也太大了。还取它的对角线会抛出很多值。

numpy
einsum` 不适用于稀疏数组。

 einsum('ij, jik->ik', A, B) 

表明如果

B
可以重新排列为
ijk
,您可以将
i
视为匹配维度。有了
matmul
你就可以做到

'i1j, ijk -> i1k'  (last j of A with 2nd to last j of B)

因此,您可以迭代 A 和 B 的

i
维度,对 A[i,:] (1d) 和 B[:,i,:] (2d) 进行 matmul。但由于 B 的最后一个维度 64 相对较小,也许您可以对此进行迭代。

无论如何,您可能需要花费更多时间阅读有关稀疏的张量流文档。

© www.soinside.com 2019 - 2024. All rights reserved.