【问题标题】:How can I combine and overlap two tensors?如何组合和重叠两个张量?
【发布时间】:2019-12-31 03:17:58
【问题描述】:

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

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

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

谁能帮忙?

【问题讨论】:

  • 你能解释一下你所说的部分重叠是什么意思吗?您给出的示例并不完全明显。例如。结果有维度2x5来自维度2x3的两个张量的组合不是很自然。

标签: python pytorch


【解决方案1】:

这不是一个简单的操作,这个解决方案也不是很简单或直观。

查看带有 shape=(2, 5)result,您可以将ab 视为resultstride=2 的两个2x3 补丁。像这样的插图:

我们可以使用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)

我们还没有,当有重叠的元素foldsums 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

result = raw / counter
tensor([[[[1., 2., 4., 6., 7.],
          [1., 2., 4., 6., 7.]]]])

小菜一碟。

【讨论】:

  • 我按照你的第一段代码得到了recovered,然后我已经得到了NotImplementedError: Input Error: Only 4D input Tensors are supported (got 2D)。我正在使用 PyTorch 1.6.0
猜你喜欢
  • 2019-07-05
  • 2021-01-10
  • 1970-01-01
  • 2014-01-08
  • 2017-02-06
  • 2018-08-09
  • 2023-03-18
  • 1970-01-01
  • 2011-06-23
相关资源
最近更新 更多