当前位置:网站首页>动手学深度学习_GoogLeNet / Inceptionv1v2v3v4
动手学深度学习_GoogLeNet / Inceptionv1v2v3v4
2022-08-05 11:23:00 【CV小Rookie】
GoogLeNet 是根据 NiN 中串联网络的思想,在此基础上进行改进。篇论文的一个重点是解决了什么样大小的卷积核最合适的问题。 毕竟,以前流行的网络使用小到 1 × 1,大到 11 × 11 的卷积核。 本文的一个观点是,有时使用不同大小的卷积核组合是有利的。这里我们写的代码,是GoogLeNet 的简化版,原版的实现我贴到最后,就不逐一分析了,基本思路一致。
在GoogLeNet中,基本的卷积块被称为 Inception 块(Inception block)
Inception block:
class Inception(nn.Module):
# c1--c4是每条路径的输出通道数
def __init__(self, in_channels, c1, c2, c3, c4, **kwargs):
super(Inception, self).__init__(**kwargs)
# 线路1,单1x1卷积层
self.p1_1 = nn.Conv2d(in_channels, c1, kernel_size=1)
# 线路2,1x1卷积层后接3x3卷积层
self.p2_1 = nn.Conv2d(in_channels, c2[0], kernel_size=1)
self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)
# 线路3,1x1卷积层后接5x5卷积层
self.p3_1 = nn.Conv2d(in_channels, c3[0], kernel_size=1)
self.p3_2 = nn.Conv2d(c3[0], c3[1], kernel_size=5, padding=2)
# 线路4,3x3最大汇聚层后接1x1卷积层
self.p4_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
self.p4_2 = nn.Conv2d(in_channels, c4, kernel_size=1)
def forward(self, x):
p1 = F.relu(self.p1_1(x))
p2 = F.relu(self.p2_2(F.relu(self.p2_1(x))))
p3 = F.relu(self.p3_2(F.relu(self.p3_1(x))))
p4 = F.relu(self.p4_2(self.p4_1(x)))
# 在通道维度上连结输出
return torch.cat((p1, p2, p3, p4), dim=1)
这是我们今天要实现的简化版 GoogLeNet 。我们把它分成5个块,分别依据是高宽减半称为一个 Stage 。
Stage 1 :输出 64 通道,7 x 7 的卷积层;(这里还是使用 MNIST,所以一开始输入通道是 1 ,最后输出是 10)
b1 = nn.Sequential(nn.Conv2d(1, 64, kernel_size=7, stride=2, padding=3),
nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
Stage 2 :输出64通道, 1 x 1 的卷积层;输出通道 192 ,3 × 3 卷积层;
b2 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1),
nn.ReLU(),
nn.Conv2d(64, 192, kernel_size=3, padding=1),
nn.ReLU(),
nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
Stage 3 :
第一个 Inception 块的输出通道数(从左到右)为 64+128+32+32=256 ,其中路径 2 和 3 首先将输入通道的数量分别减少到 96 和 16 ,然后连接其第二个卷积层。
第二个 Inception 块的输出通道数为 128+192+96+64=480 ,其中路径 2 和 3 首先将输入通道的数量分别减少到 128 和 32 ,然后连接其第二个卷积层。
b3 = nn.Sequential(Inception(192, 64, (96, 128), (16, 32), 32),
Inception(256, 128, (128, 192), (32, 96), 64),
nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
Stage 4:第四模块更加复杂, 它串联了5个Inception块。
第一个 Inception 块的输出通道数为192+208+48+64=512 ,其中路径 2 和 3 首先将输入通道的数量分别减少到 96 和 16 ,然后连接其第二个卷积层。
第二个 Inception 块的输出通道数为160+224+64+64=512 ,其中路径 2 和 3 首先将输入通道的数量分别减少到 112 和 24 ,然后连接其第二个卷积层。
第三个 Inception 块的输出通道数为 128+256+64+64=512 ,其中路径 2 和 3 首先将输入通道的数量分别减少到 128 和 24 ,然后连接其第二个卷积层。
第四个 Inception 块的输出通道数为 112+288+64+64=528 ,其中路径 2 和 3 首先将输入通道的数量分别减少到 144 和 32 ,然后连接其第二个卷积层。
第五个 Inception 块的输出通道数为 256+320+128+128=832 ,其中路径 2 和 3 首先将输入通道的数量分别减少到 160 和 32 ,然后连接其第二个卷积层。
b4 = nn.Sequential(Inception(480, 192, (96, 208), (16, 48), 64),
Inception(512, 160, (112, 224), (24, 64), 64),
Inception(512, 128, (128, 256), (24, 64), 64),
Inception(512, 112, (144, 288), (32, 64), 64),
Inception(528, 256, (160, 320), (32, 128), 128),
nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
Stage 5:
第一个 Inception 块的输出通道数为 256+320+128+128=832 ,其中路径 2 和 3 首先将输入通道的数量分别减少到 160 和 32 ,然后连接其第二个卷积层。
第二个 Inception 块的输出通道数为 384+384+128+128=1024 ,其中路径 2 和 3 首先将输入通道的数量分别减少到 192 和 48 ,然后连接其第二个卷积层。
然后紧跟一个全局平均池化层,将每个通道的高和宽降低为 1 x 1 ,最后 Flatten 展平。
b5 = nn.Sequential(Inception(832, 256, (160, 320), (32, 128), 128),
Inception(832, 384, (192, 384), (48, 128), 128),
nn.AdaptiveAvgPool2d((1,1)),
nn.Flatten())
net = nn.Sequential(b1, b2, b3, b4, b5, nn.Linear(1024, 10))
Sequential output shape: torch.Size([1, 64, 24, 24]) Sequential output shape: torch.Size([1, 192, 12, 12]) Sequential output shape: torch.Size([1, 480, 6, 6]) Sequential output shape: torch.Size([1, 832, 3, 3]) Sequential output shape: torch.Size([1, 1024]) Linear output shape: torch.Size([1, 10])
Inceptionv1v2v3v4的代码我放到这里,有需要的可以去下载:Inception
边栏推荐
猜你喜欢
MySQL 中 auto_increment 自动插入主键值
012年通过修补_sss_提高扩散模型效率
苹果Meta都在冲的Pancake技术,中国VR团队YVR竟抢先交出产品答卷
365 days challenge LeetCode1000 questions - Day 050 add a row to the binary tree binary tree
【OpenCV】-仿射变换
Machine Learning - Ensemble Learning
Four, kubeadm single master
Dynamics 365Online PDF导出及打印
【加密解密】明文加密解密-已实现【已应用】
Scaling-law和模型结构的关系:不是所有的结构放大后都能保持最好性能
随机推荐
四、kubeadm单master
hdu4545 魔法串
flutter 服务器返回数据判断是否为空
Android 开发用 Kotlin 编程语言三 循环控制
HDD杭州站•ArkUI让开发更灵活
使用Windbg过程中两个使用细节分享
双因子与多因子身份验证有什么区别?
abc262-D(dp)
What do T and Z in the time format 2020-01-13T16:00:00.000Z represent and how to deal with them
智能算力的枢纽如何构建?中国云都的淮海智算中心打了个样
poj2287 Tian Ji -- The Horse Racing(2016xynu暑期集训检测 -----C题)
安全软件Avast与赛门铁克诺顿NortonLifeLock合并获英国批准
前沿技术数字孪生如何应用在智慧城市上?
支持向量机SVM
提取人脸特征的三种方法
Support Vector Machine SVM
解决【命令行/终端】颜色输出问题
.NET深入解析LINQ框架(六:LINQ执行表达式)
一张图理解EOS是什么
大佬们 我是新手,我根据文档用flinksql 写个简单的用户访问量的count 但是执行一次就结束