如何合并和重叠两个张量?

时间:2019-08-27 00:14:53

标签: python pytorch

我有两个张量,它们应该相互重叠以形成更大的张量。为了说明:

a = torch.Tensor([[1, 2, 3], [1, 2, 3]])
b = torch.Tensor([[5, 6, 7], [5, 6, 7]])

a = [[1 2 3]    b = [[5 6 7]
     [1 2 3]]        [5 6 7]]

我想将两个张量组合起来,使它们部分重叠在同一列中,取那些重叠的元素的平均值。

例如

result = [[1 2 4 6 7]
          [1 2 4 6 7]]

前两列是“ a”的前两列。最后两列是“ b”的最后两列。中间一栏是“ a”最后一栏和“ b”第一栏的平均值。

我知道如何将两个张量并排或合并成新的维。但这使我难以理解。

有人可以帮忙吗?

1 个答案:

答案 0 :(得分:3)

这不是微不足道的操作,而且此解决方案也不是很简单或直观的。

result的形状= (2, 5),您可以将ab看作是两个2x3的{​​{1}}补丁, result。像这样的插图:
enter image description here

我们可以使用pytorch的{​​{3}}从stride=2“恢复”绿色(a)和蓝色(b)色块(“恢复”直至平均值) ):

result

结果是:

from torch.nn import functional as nnf

recovered = nnf.unfold(result, kernel_size=(2,3), stride=2)

修补程序已恢复(作为列向量)。

现在,我们了解了如何从tensor([[[1., 4.], [2., 6.], [4., 7.], [1., 4.], [2., 6.], [4., 7.]]]) 获取ab,我们可以使用unfold执行“逆向”运算并从{{1} }和resultb
首先,我们需要将bresult拼接成a期望的形状(模仿b的输出,模仿了两个3x2元素的“扁平化”补丁):

fold

我们现在可以“折叠”补丁

unfold

我们还不存在,当有重叠元素uf = torch.cat((a.view(1, 6, 1), b.view(1, 6, 1)), dim=2) fold时,重叠元素导致

raw = nnf.fold(uf, (2,5), kernel_size=(2,3), stride=2)

要计算结果中每个条目相加的元素个数,我们可以简单地“折叠”所有张量

fold

最后,我们可以恢复tensor([[[[1., 2., 8., 6., 7.], [1., 2., 8., 6., 7.]]]])

counter = nnf.fold(torch.ones_like(uf), (2, 5), kernel_size=(2, 3), stride=2)
result

一块蛋糕