1

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

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()返回所有大小的切片”,但是尽我所能,我只是无法很好地理解为什么堆叠两个调用会产生方形补丁。我知道当你在张量上使用一次时会发生什么。我不明白当你在两个不同的维度上连续调用它两次时会发生什么。sizedim.unfold()unfold()

我已经多次看到这种方法被使用过,但总是没有很好地解释它为什么起作用(1、2),这让我发疯了。为什么空间维度HW置换为暗淡 1 和 2,而通道暗淡设置为 3?为什么在昏暗 1 上以相同的方式展开,然后在昏暗 2 上会产生正方形patch_widthpatch_width补丁?

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

[1] PyTorch 论坛帖子

[2]另一个论坛帖子做同样的事情

4

2 回答 2

1

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

第一个时刻是相当技术性的 -unfold将生成的切片放置在张量的新维度中,“插入到形状的末端”。permute此处需要将其放置在通道或深度维度附近,以便view以后使用自然方式合并它们。

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

于 2021-04-15T15:46:15.277 回答
1

让我们看一个简单的 2d 示例,看看为什么组合操作会产生“补丁”。

在此处输入图像描述


代码:

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]]]])
于 2021-04-15T18:53:07.267 回答