3D张量的Pytorch内积与1D张量生成2D张量

时间:2019-01-31 10:52:17

标签: python deep-learning pytorch

操作:我有尺寸为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”中必须执行此步骤才能进行声音本地化步骤。

1 个答案:

答案 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,它可以优化底层操作的顺序以提高性能。