gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 11:13:19 32 4
gpt4 key购买 nike

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

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 的第一列的平均值。

我知道如何将两个张量并排合并或合并到一个新的维度中。但是我无法做到这一点。

有人能帮忙吗?

最佳答案

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

用shape=(2, 5)result,可以想到ab作为 stride=2 获取的 result 的两个 2x3 补丁。喜欢这个插图:
enter image description here

我们可以使用pytorch的unfoldresult 中“恢复”绿色 (a) 和蓝色 (b) 补丁(“恢复”到平均值):

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.]]])

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

现在我们了解了如何从result 中获取ab,我们可以使用fold执行“反向”操作,从 bbresult
首先,我们需要将 ab 拼合成 fold 期望的形状(模仿 unfold 的输出,两个 3x2 元素的“展平”补丁):

uf = torch.cat((a.view(1, 6, 1), b.view(1, 6, 1)), dim=2)

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

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

我们还没有做到,当有重叠元素时 fold sums up重叠的元素,导致

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 = raw / counter
tensor([[[[1., 2., 4., 6., 7.],
[1., 2., 4., 6., 7.]]]])

小菜一碟。

关于python - 如何组合和重叠两个张量?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57666249/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com