操作:我有尺寸为A
的火炬张量[n x m x c]
和尺寸为B
的{{1}}。我想取[1 x 1 x c]
与1 x 1 x c
的每个A
向量的内积,并因此生成尺寸为B
的张量C
。
在特定步骤中,在网络的内部正向功能中,我收到了维数[n x m]
的张量,其中N是图像数量,channels是特征图中的通道数,高度和宽度是当前特征图中的。我还具有其他子网中的[N, channels, Height, Width]
功能图。在下一步中,我要执行上述操作。
有人可以解释pytorch中实现此步骤的最佳方法和功能。
我是pytorch的新手,无法找到合适的方法。 Tensorflow支持NHWC格式,但我认为pytorch不支持,因此一种方法是将其重塑为[N x channels]
,然后像这样进行迭代:
[N, Height, Width, channels]
还有其他更清洁的API吗?
PS:DeepMind的论文“ Object That Sound”中必须执行此步骤才能进行声音本地化步骤。
答案 0 :(得分:1)
有一个内衬
ans = torch.einsum('nhwc,nc->nhw', img, aud)
torch.einsum
的API如果您以前没有经验,可能很难掌握,但是它非常强大,并且可以概括很多线性代数运算(换位,矩阵乘法和迹线)。
import torch
N, H, W, C = 10, 11, 12, 13
img = torch.randn(N, H, W, C)
aud = torch.randn(N, C)
ans = torch.empty(N, H, W)
for batches in range(img.shape[0]):
for i in range(img.shape[1]):
for j in range(img.shape[2]):
ans[batches][i][j] = torch.dot(img[batches][i][j], aud[batches])
ans2 = torch.einsum('nhwc,nc->nhw', img, aud)
assert torch.allclose(ans, ans2, atol=1e-6)
请注意,由于数字精度问题,我不得不将断言容限提高到标准1e-8
以上。如果einsum
在更高级的用例中成为瓶颈,请查看opt_einsum,它可以优化底层操作的顺序以提高性能。