我希望我不会在这里遗漏任何明显的东西,但是我对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张量情况将具有足够的通用性。
答案 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)