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

Avi*_*man 2 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]]
Run Code Online (Sandbox Code Playgroud)

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

例如

result = [[1 2 4 6 7]
          [1 2 4 6 7]]
Run Code Online (Sandbox Code Playgroud)

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

我知道如何并排或在新维度中合并两个张量。但这样做让我望而却步。

任何人都可以帮忙吗?

Sha*_*hai 5

这不是一个微不足道的操作,这个解决方案也不是很微不足道或直观。

查看resultwith shape= (2, 5),您可以将ab视为与 一起拍摄的两个2x3补丁。像这个插图:resultstride=2
在此处输入图片说明

我们可以使用 pytorchunfold来“恢复”绿色 ( a) 和蓝色 ( b) 补丁result(“恢复”到平均值):

from torch.nn import functional as nnf

recovered = nnf.unfold(result, kernel_size=(2,3), stride=2)
Run Code Online (Sandbox Code Playgroud)

结果是:

tensor([[[1., 4.],
         [2., 6.],
         [4., 7.],
         [1., 4.],
         [2., 6.],
         [4., 7.]]])
Run Code Online (Sandbox Code Playgroud)

补丁被恢复(作为列向量)。

现在我们了解了如何 getabfrom result,我们可以使用fold来执行“逆”操作和 go frombbto result
首先,我们需要压扁连击ab的形状fold预期(模拟输出unfold,两个“扁平化” 3x2的元素的补丁):

tensor([[[1., 4.],
         [2., 6.],
         [4., 7.],
         [1., 4.],
         [2., 6.],
         [4., 7.]]])
Run Code Online (Sandbox Code Playgroud)

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

uf = torch.cat((a.view(1, 6, 1), b.view(1, 6, 1)), dim=2)
Run Code Online (Sandbox Code Playgroud)

我们还没有到那里,当有重叠元素时,将重叠元素fold 相加,结果为

tensor([[[[1., 2., 8., 6., 7.],
          [1., 2., 8., 6., 7.]]]])
Run Code Online (Sandbox Code Playgroud)

要计算结果中每个条目的总和有多少个元素,我们可以简单地“折叠”一个全为张量

raw = nnf.fold(uf, (2,5), kernel_size=(2,3), stride=2)
Run Code Online (Sandbox Code Playgroud)

最后,我们可以恢复result

tensor([[[[1., 2., 8., 6., 7.],
          [1., 2., 8., 6., 7.]]]])
Run Code Online (Sandbox Code Playgroud)
tensor([[[[1., 2., 4., 6., 7.],
          [1., 2., 4., 6., 7.]]]])
Run Code Online (Sandbox Code Playgroud)

小菜一碟。