我有一个形状为 (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 从稀疏矩阵转换为稠密矩阵。
对此有什么想法吗?我将不胜感激。
我无法直接帮助您进行 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 相对较小,也许您可以对此进行迭代。
无论如何,您可能需要花费更多时间阅读有关稀疏的张量流文档。