pytorch中的torch.nn.Unfold和torch.nn.Fold

送分小仙女□ 提交于 2020-12-16 13:46:15

1. torch.nn.Unfold(kernel_size, dilation=1, padding=0, stride=1)

torch.nn.Unfold按照官方的说法,既从一个batch的样本中,提取出滑动的局部区域块,也就是卷积操作中的提取kernel filter对应的滑动窗口。
1)由上可知,torch.nn.Unfold的参数跟nn.Conv2d的参数很相似,即,kernel_size(卷积核的尺寸),dilation(空洞大小),padding(填充大小)和stride(步长)。
2)官方解释中:unfold的输入为( N, C, H, W),其中N为batch_size,C是channel个数,H和W分别是channel的长宽。则unfold的输出为( N, C × π ( k e r n e l _ s i z e ) C\times\pi (kernel\_size) C×π(kernel_size), L),其中 π ( k e r n e l _ s i z e ) \pi (kernel \_size) π(kernel_size)为kernel_size长和宽的乘积, L是channel的长宽根据kernel_size的长宽滑动裁剪后,得到的区块的数量。
3)例如:输入(1, 2, 4, 4),假设kernel_size = (2, 2),stride = 2,根据官方给出的L计算公式
在这里插入图片描述
其中d是channel的维度,二维图像既长宽的维度。则得到L(区块数量)为 :
在这里插入图片描述每个区块的大小为 C × \times × kernel_size[ 0 ] × \times × kernel_size[ 1 ] ,既 2 × 2 × 2 = 8,作为输出的第二个维度。
4) 代码展示:






inputs = torch.randn(1, 2, 4, 4)
print(inputs.size())
print(inputs)
unfold = torch.nn.Unfold(kernel_size=(2, 2), stride=2)
patches = unfold(inputs)
print(patches.size())
print(patches)

在这里插入图片描述
5)对代码结果分析,nn.Unfold对输入channel的每一个kernel_size[ 0 ] × \times × kernel_size[ 1 ] 的滑动窗口区块做了展平操作。
在这里插入图片描述

2. torch.nn.Fold(output_size, kernel_size, dilation=1, padding=0, stride=1)

torch.nn.Fold的操作与Unfold相反,将提取出的滑动局部区域块还原成batch的张量形式。
1)代码如下:

fold = torch.nn.Fold(output_size=(4, 4), kernel_size=(2, 2), stride=2)
inputs_restore = fold(patches)
print(inputs_restore)
print(inputs_restore.size())

2)代码分析:Fold的操作通过设定output_size=(4, 4),完成与Unfold的互逆的操作。
在这里插入图片描述
借鉴博文:https://blog.csdn.net/weixin_44076434/article/details/106545037?utm_medium=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control&depth_1-utm_source=distribute.pc_relevant_t0.none-task-blog-BlogCommendFromBaidu-1.control

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!