我有两个张量,它们应该相互重叠以形成一个更大的张量。为了显示:
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 的第一列的平均值。
我知道如何并排或在新维度中合并两个张量。但这样做让我望而却步。
任何人都可以帮忙吗?
这不是一个微不足道的操作,这个解决方案也不是很微不足道或直观。
查看result
with shape= (2, 5)
,您可以将a
和b
视为与 一起拍摄的两个2x3
补丁。像这个插图:result
stride=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)
结果是:
Run Code Online (Sandbox Code Playgroud)tensor([[[1., 4.], [2., 6.], [4., 7.], [1., 4.], [2., 6.], [4., 7.]]])
补丁被恢复(作为列向量)。
现在我们了解了如何 geta
和b
from result
,我们可以使用fold
来执行“逆”操作和 go fromb
和b
to result
。
首先,我们需要压扁连击a
和b
的形状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
相加,结果为
Run Code Online (Sandbox Code Playgroud)tensor([[[[1., 2., 8., 6., 7.], [1., 2., 8., 6., 7.]]]])
要计算结果中每个条目的总和有多少个元素,我们可以简单地“折叠”一个全为张量
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)
Run Code Online (Sandbox Code Playgroud)tensor([[[[1., 2., 4., 6., 7.], [1., 2., 4., 6., 7.]]]])
小菜一碟。