张量流(或numpy)中特定维度的矩阵乘法

时间:2018-12-11 22:05:18

标签: python numpy tensorflow tensor

我希望我不会在这里遗漏任何明显的东西,但是我对inter-webs进行了无济于事的搜索,最后来这里提问...
这是我想要做的一个非常简单的描述:
假设我有一个形状为(20, 40, 3, 5)的张量,和另一个形状为(20, 40, 5, 7)的张量。前两个尺寸大小应保持不变,并且对于两个张量目的是相同的。另一方面, last 的两个维度是(矩阵)乘以matmul样式。意味着我得到的张量将为(20, 40, 3, 7)。怎么办?
我意识到从理论上讲我可以循环使用前两个维度并直接使用tf.matmul(),但是由于运行时,效率,模型训练器和GPU在全球范围内的抗议以及我的良心,这绝对是不可行的任何重量:-)。

不幸的是,我将以下选项忽略为“不是我所需要的”:
tf.tensordot将为我提供形状为(20, 40, 3, 20, 40, 7)的输出。不好
tf.scan仅在我正确阅读的情况下才对第一个维度有利(也许适合RNN?无论如何都不适合我的情况)。
tf.matmul适用于等级大于等于2的张量,但在最后一个维度和第一个维度上的作用类似于@。再说一次,不是我的情况。

再说一遍-如何做到?
一个numpy的答案可以帮助我朝正确的方向发展也将非常有帮助,但最终我需要一个tf的实现。

在此先感谢您,如果我错过了一些愚蠢的东西,我们深表歉意。


以下内容更接近我的需求,但不清楚,因此需要单独编写:
前两个维度是图像的空间维度。最后两个实际上是通过tf.contrib.distributions.fill_triangular获得的平方矩阵,并且将它们相乘(以及在其中一个矩阵上进行适当的转置),以获得与每个空间坐标关联的协方差矩阵。我不知道这是否有任何帮助,但至少会提供一些背景信息。此外,可能也可能没有批处理维,但是我假设求解4-D张量情况将具有足够的通用性。

1 个答案:

答案 0 :(得分:1)

将其发布以供将来参考:
来自numpy matmul文档:

  

如果任一自变量为N-D,N> 2,则将其视为一组矩阵   驻留在最后两个索引中,并进行相应广播。

对于维度>2,它将把它视为一堆矩阵,尝试尝试matmul的最后2个维度,因此需要np array作为OP。
例如:

import numpy as np

A = np.ones((1,2,1,2))
B = np.ones((1,2,2,1))

print(A.shape)
print(B.shape)
print(np.matmul(A,B).shape)

结果:

(1, 2, 1, 2)
(1, 2, 2, 1)
(1, 2, 1, 1)