最近,我发现一些代码从N形状的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()方法“从维度dim中的自张量返回所有大小的size”,尽管我可能会尝试,但是我不能很好地直观地知道为什么堆叠两个.unfold()调用会产生正方形补丁。我知道当你在张量上使用unfold()一次时会发生什么。当你在两个不同的维度上连续两次调用它时,我不明白会发生什么。
我见过这种方法多次使用,总是没有一个很好的解释,为什么它工作(1,2),它使我疯狂。为什么空间维H和W被设置为dims 1和2,而信道dim设置为3?为什么在dim 1上以同样的方式展开,然后在dim 2上通过patch_width补丁产生方形的patch_width?
任何洞察力都会受到极大的赞赏,即使这只是我错过的一篇文章的链接。我已经在谷歌上搜索了一个多小时,但几乎没有什么成功。谢谢!
发布于 2021-04-15 15:46:15
我想,在您的问题中有两个不同的部分,第一部分是为什么需要permute,其次是两个unfold是如何组合生成方形图像切片的。
第一时刻是相当技术性的-- unfold位置在张量的新维中产生了切片,“插入在形状的末尾”。这里需要permute将其放置在通道或深度维度附近,以便稍后使用view将它们合并为自然的方式。
现在是第二部分。假设一副假想的卡片,每一张卡片都是一个图片通道。拿一张卡片,把它切在垂直的切片上,然后把它们放在另一张上面。拿第二张牌,做同样的事,把结果放在第一张牌上,用所有的牌来做。现在,重复这个过程,切切片角质层。在最后,你有更薄但更高的牌,在那里以前的牌会变成补丁的子甲板。
发布于 2021-04-15 18:53:07
让我们看一个简单的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]]]])https://stackoverflow.com/questions/67104280
复制相似问题