二、如何计算输出的size
- 栗子
import torch
import torch.nn as nn
if name == ‘main’:
x = torch.randn(2, 3, 5, 5)
print(x)
unfold = nn.Unfold(2)
y = unfold(x)
print(y.size())
print(y)
- 运行结果
torch.Size([2, 12, 16])
接下来,我们一步一步分析这个结果是怎么计算出来的!
首先,要知道的是,我们的输入必须是4维的,即(B,C,H,W),其中,B表示Batch size;C代表通道数;H代表feature map的高;W表示feature map的宽。首先,我们假设经过Unfolder处理之后的size为(B,h,w)。然后我们需要计算h(即输出的高),计算公式如下所示:
这里是引用举个栗子:假设输入通道数为3,kernel size为(2,2),图片最常见的通道数为3(所以我们拿来举例),经过Unfolder方法后,输出的高变为3_2_2=12,即输出的H为12。
计算完成之后,我们需要计算w,计算公式如下所示:
其中,d代表的是空间的所有维度数,例如空间维度为(H,W),则d=2。下面通过举例,我们来计算输出的w。
举个栗子:如果输入的H、W分别为5,kernel size为2,则输出的w为
4*4=16,故最终的输出size为[2,12,16]。
三、案例
import torch
import torch.nn as nn
if name == ‘main’:
x = torch.randn(1, 3, 5, 5)
print(x)
unfold = nn.Unfold(kernel_size=3)
output = unfold(x)
print(output, output.size())
tensor([[[[ 0.4009, 0.6350, -0.5197, 0.8148, -0.7235],
[-1.2102, 0.4621, -0.3421, -0.9261, -2.8376],
[-1.5553, 0.1713, 0.6820, -2.0880, -0.0204],
[ 1.1419, -0.4881, -0.9510, -0.0367, -0.8108],
[ 0.1459, -0.4568, 1.0039, -1.2385, -1.4467]],
[[-0.9973, -0.7601, -0.2161, 1.2120, -0.3036],
[-0.7279, 0.0833, -0.8886, -0.9168, 0.7503],
[-0.6748, 0.7064, 0.6903, -1.0447, 0.8688],
[-0.5230, -1.2308, -0.3932, 1.2521, -0.2523],
[-0.3930, 0.6452, 0.1690, 0.3744, 0.2015]],
[[ 0.6403, 1.3915, -1.9529, 0.2899, -0.8897],
[-0.1720, 1.0843, -1.0177, -1.7480, -0.5217],
[-0.9648, -0.0867, -0.2926, 0.3010, 0.3192],
[ 0.1181, -0.2218, 0.0766, 0.5914, -0.8932],
[-0.4508, -0.3964, 1.1163, 0.6776, -0.8948]]]])
tensor([[[ 0.4009, 0.6350, -0.5197, -1.2102, 0.4621, -0.3421, -1.5553,
0.1713, 0.6820],
[ 0.6350, -0.5197, 0.8148, 0.4621, -0.3421, -0.9261, 0.1713,
0.6820, -2.0880],
[-0.5197, 0.8148, -0.7235, -0.3421, -0.9261, -2.8376, 0.6820,
-2.0880, -0.0204],
[-1.2102, 0.4621, -0.3421, -1.5553, 0.1713, 0.6820, 1.1419,
-0.4881, -0.9510],
[ 0.4621, -0.3421, -0.9261, 0.1713, 0.6820, -2.0880, -0.4881,
-0.9510, -0.0367],
[-0.3421, -0.9261, -2.8376, 0.6820, -2.0880, -0.0204, -0.9510,
-0.0367, -0.8108],
[-1.5553, 0.1713, 0.6820, 1.1419, -0.4881, -0.9510, 0.1459,
-0.4568, 1.0039],
[ 0.1713, 0.6820, -2.0880, -0.4881, -0.9510, -0.0367, -0.4568,
1.0039, -1.2385],
[ 0.6820, -2.0880, -0.0204, -0.9510, -0.0367, -0.8108, 1.0039,
-1.2385, -1.4467],
[-0.9973, -0.7601, -0.2161, -0.7279, 0.0833, -0.8886, -0.6748,
0.7064, 0.6903],
[-0.7601, -0.2161, 1.2120, 0.0833, -0.8886, -0.9168, 0.7064,
0.6903, -1.0447],
[-0.2161, 1.2120, -0.3036, -0.8886, -0.9168, 0.7503, 0.6903,
-1.0447, 0.8688],
[-0.7279, 0.0833, -0.8886, -0.6748, 0.7064, 0.6903, -0.5230,
-1.2308, -0.3932],
[ 0.0833, -0.8886, -0.9168, 0.7064, 0.6903, -1.0447, -1.2308,
-0.3932, 1.2521],
[-0.8886, -0.9168, 0.7503, 0.6903, -1.0447, 0.8688, -0.3932,
1.2521, -0.2523],
[-0.6748, 0.7064, 0.6903, -0.5230, -1.2308, -0.3932, -0.3930,
0.6452, 0.1690],
[ 0.7064, 0.6903, -1.0447, -1.2308, -0.3932, 1.2521, 0.6452,
0.1690, 0.3744],
[ 0.6903, -1.0447, 0.8688, -0.3932, 1.2521, -0.2523, 0.1690,
0.3744, 0.2015],
[ 0.6403, 1.3915, -1.9529, -0.1720, 1.0843, -1.0177, -0.9648,
-0.0867, -0.2926],
[ 1.3915, -1.9529, 0.2899, 1.0843, -1.0177, -1.7480, -0.0867,
-0.2926, 0.3010],
[-1.9529, 0.2899, -0.8897, -1.0177, -1.7480, -0.5217, -0.2926,
0.3010, 0.3192],
[-0.1720, 1.0843, -1.0177, -0.9648, -0.0867, -0.2926, 0.1181,
-0.2218, 0.0766],
[ 1.0843, -1.0177, -1.7480, -0.0867, -0.2926, 0.3010, -0.2218,
0.0766, 0.5914],
最后
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Java工程师,想要提升技能,往往是自己摸索成长,自己不成体系的自学效果低效漫长且无助。
因此收集整理了一份《2024年Java开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!
有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Java开发知识点,不论你是刚入门Android开发的新手,还是希望在技术上不断提升的资深开发者,这些资料都将为你打开新的学习之门!**
如果你觉得这些内容对你有帮助,需要这份全套学习资料的朋友可以戳我获取!!
由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且会持续更新!