我在哪里可以找到 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),这让我发疯。为什么空间维度 H
和 W
置换为 dims 1 和 2,而通道 dim 设置为 3?为什么在 dim 1 上以相同的方式展开,然后在 dim 2 上展开 patch_width
块 patch_width
个方块?
任何见解都将不胜感激,即使它只是对我错过的一篇文章的 link。我已经在谷歌上搜索了一个多小时,但收效甚微。谢谢!
我想,你的问题有两个不同的部分,第一个是你为什么需要 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]]]])
最近我发现一些代码从形状为 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),这让我发疯。为什么空间维度 H
和 W
置换为 dims 1 和 2,而通道 dim 设置为 3?为什么在 dim 1 上以相同的方式展开,然后在 dim 2 上展开 patch_width
块 patch_width
个方块?
任何见解都将不胜感激,即使它只是对我错过的一篇文章的 link。我已经在谷歌上搜索了一个多小时,但收效甚微。谢谢!
我想,你的问题有两个不同的部分,第一个是你为什么需要 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]]]])