我有两个张量,它们应该相互重叠以形成更大的张量。为了说明:
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”第一栏的平均值。
我知道如何将两个张量并排或合并成新的维。但这使我难以理解。
有人可以帮忙吗?
答案 0 :(得分:3)
这不是微不足道的操作,而且此解决方案也不是很简单或直观的。
看result
的形状= (2, 5)
,您可以将a
和b
看作是两个2x3
的{{1}}补丁, result
。像这样的插图:
我们可以使用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.]]])
获取a
和b
,我们可以使用unfold
执行“逆向”运算并从{{1} }和result
至b
。
首先,我们需要将b
和result
拼接成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
一块蛋糕