我在哪里可以找到 PyTorch 的 Tensor.unfold() 用于获取图像补丁的直观解释?

Where I can find an intuitive explanation of PyTorch's Tensor.unfold() being used to get image patches?

最近我发现一些代码从形状为 N x B x H x W 的 RGB 图像(或它们的集合)中提取(滑动-window 样式)许多方形块。他们做到了这如下:

patch_width = 3
patches = image.permute(0,2,3,1).unfold(dim = 1, size = patch_width, stride = patch_width) \
        .unfold(dim = 2, size = patch_width, stride = patch_width)

我从阅读文档中了解到 unfold() 方法“returns 来自维度 dim 中自张量的所有大小 size 的所有切片”,但是尽我所能,我只是无法很好地理解为什么堆叠两个 .unfold() 调用会产生方形补丁。我 得到 当你在张量上使用一次 unfold() 时会发生什么。我不明白当你沿着两个不同的维度连续调用它两次时会发生什么。

我已经多次看到这种方法被使用过,但总是没有很好的解释 为什么 它有效 (1, 2),这让我发疯。为什么空间维度 HW 置换为 dims 1 和 2,而通道 dim 设置为 3?为什么在 dim 1 上以相同的方式展开,然后在 dim 2 上展开 patch_widthpatch_width 个方块?

任何见解都将不胜感激,即使它只是对我错过的一篇文章的 link。我已经在谷歌上搜索了一个多小时,但收效甚微。谢谢!

[1]PyTorch forum post

[2]Another forum post doing the same thing

我想,你的问题有两个不同的部分,第一个是你为什么需要 permute,第二个是两个 unfold 组合如何产生方形图像切片。

第一个时刻是相当技术性的 - unfold 将生成的切片放在张量的新维度中,即 'inserted at the end of the shape'。 permute 这里需要将其放置在通道或深度维度附近,以便稍后使用 view 自然地合并它们。

现在是第二部分。考虑一副假想的卡片,每张卡片都是一个图片通道。拿一张卡片,把它切成垂直的切片,然后把切片放在一起。拿第二张牌并做同样的事情,将结果放在第一张牌上,对所有牌都这样做。现在重复该过程,水平切割切片。最后你有更薄但更高的牌组,以前的牌变成了补丁的子牌组。

让我们看一个简单的二维示例,看看为什么组合操作会产生 'patches'。


代码:

x = torch.tensor([[1, 2, 3, 4, 5],
                  [6, 7, 8, 9, 10],
                  [11,12,13,14,15]])
>>> x.unfold(1,2,1)
tensor([[[ 1,  2], [ 2,  3], [ 3,  4], [ 4,  5]],
        [[ 6,  7], [ 7,  8], [ 8,  9], [ 9, 10]],
        [[11, 12], [12, 13], [13, 14], [14, 15]]])
>>> x.unfold(1,2,1).unfold(0,2,1)
tensor([[[[ 1,  6],
          [ 2,  7]],

         [[ 2,  7],
          [ 3,  8]],

         [[ 3,  8],
          [ 4,  9]],

         [[ 4,  9],
          [ 5, 10]]],


        [[[ 6, 11],
          [ 7, 12]],

         [[ 7, 12],
          [ 8, 13]],

         [[ 8, 13],
          [ 9, 14]],

         [[ 9, 14],
          [10, 15]]]])