底层是用img2col实现的,但是如果想用pytorch来实现,可以试试torch.unfold这个函数,也可以硬写
torch.unfold
torch.unfold可以按照指定维度,以一定的间隔将原始张量进行分片(slicing),然后返回重整后的张量。先以二维矩阵展示其用法
>>> a = torch.arange(16).view(4, 4)
>>> a
tensor([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11],
[12, 13, 14, 15]])
>>> b = a.unfold(0, 3, 1) # 按照行,以每3个元素,跨步为1进行展开
>>> b
tensor([[[ 0, 4, 8],
[ 1, 5, 9],
[ 2, 6, 10],
[ 3, 7, 11]],
[[ 4, 8, 12],
[ 5, 9, 13],
[ 6, 10, 14],
[ 7, 11, 15]]])
>>> b.shape
torch.Size([2, 4, 3])
>>> c = b.unfold(1, 3, 1) # 对b按照列以每3个元素跨步为1进行展开
>>> c # 注意此时c即为3x3滑动窗展开结果
tensor([[[[ 0, 1, 2],
[ 4, 5, 6],
[ 8, 9, 10]],
[[ 1, 2, 3],
[ 5, 6, 7],
[ 9, 10, 11]]]