当前位置:网站首页>动手学深度学习_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
边栏推荐
- Android development with Kotlin programming language II Conditional control
- How OpenHarmony Query Device Type
- 巴比特 | 元宇宙每日必读:中国1775万件数字藏品分析报告显示,85%的已发行数藏开通了转赠功能...
- trie树模板
- 智源社区AI周刊No.92:“计算复杂度”理论奠基人Juris Hartmanis逝世;美国AI学生九年涨2倍,大学教师短缺;2022智源大会观点报告发布[附下载]
- Android 开发用 Kotlin 编程语言 二 条件控制
- 负载均衡应用场景
- JS 从零手写实现一个call、apply方法
- 再获殊荣 | 赛宁网安入选2022年度“培育独角兽”企业榜单
- SkiaSharp 之 WPF 自绘 投篮小游戏(案例版)
猜你喜欢
随机推荐
#yyds干货盘点#【愚公系列】2022年08月 Go教学课程 001-Go语言前提简介
自定义过滤器和拦截器实现ThreadLocal线程封闭
祝所有码农七夕快乐~
Machine Learning - Ensemble Learning
shell编程流程控制练习
Guys, I am a novice. I use flinksql to write a simple count of user visits according to the document, but it ends after executing it once.
hdu4545 魔法串
365天挑战LeetCode1000题——Day 050 在二叉树中增加一行 二叉树
Mathcad 15.0软件安装包下载及安装教程
结合“xPlus”探讨软件架构的创新与变革
The fuse: OAuth 2.0 four authorized login methods must read
Header file search rules when compiling with GCC
Opencv算术操作
Three methods for extracting facial features
STM32入门开发:编写XPT2046电阻触摸屏驱动(模拟SPI)
#yyds干货盘点#JS数组和树相互转化
支持向量机SVM
ECCV 2022 | 视听分割:全新任务,助力视听场景像素级精细化理解
365 days challenge LeetCode1000 questions - Day 050 add a row to the binary tree binary tree
金融业“限薪令”出台/ 软银出售过半阿里持仓/ DeepMind新实验室成立... 今日更多新鲜事在此...


![智源社区AI周刊No.92:“计算复杂度”理论奠基人Juris Hartmanis逝世;美国AI学生九年涨2倍,大学教师短缺;2022智源大会观点报告发布[附下载]](/img/e7/df5a17d372a4324d1a2120829d03e9.png)





