经典神经网络 | GoogleNet 论文解析及代码实现

简介: 经典神经网络 | GoogleNet 论文解析及代码实现

157c14dd29db3565e580133a18c84549.png

论文研究目标


利用赫布理论和多尺度处理直觉设计一种增加深度和宽度的提高内部计算资源利用率的(同时保持了计算预算不变)网络。GoogleNet在ImageNet分类比赛的Top-5错误率降到了6.7%。

创新点


  • 提出Inception模块
  • 使用辅助Loss
  • 全连接层使用简单的平均池化代替

网络主要结构


138a3b3c4fcbfd7718c3122530ac66cd.jpg

图一  网络总体架构

上图为主要包含Inception块+辅助分类器的GoogLeNet结构示意图。

Inception模块


07a80b0b161ebd3a157dad1d465ccf98.jpg

上图为Inception块示意图 (a)为普通的Inception块;(b)为带有1×1卷积的,可以对输入通道降维的Inception块

Inception模块特点


  1. 由Inception基础块组成。
  2. Inception块相当于⼀个有4条线路的⼦⽹络。它通过不同窗口形状的卷积层和最⼤池化层来并⾏抽取信息,并使⽤1×1卷积层减少通道数从而降低模型复杂度。
  3. 可以⾃定义的超参数是每个层的输出通道数,我们以此来控制模型复杂度。

371ac25cc9e41aee3cfd4276d9d52e1c.png

针对同一个输入层,在Inception块中有四条并行的线路,其中前1~3个是1×1卷积层,第4个是一个MaxPooling池化层,这四条线路最后的输出拥有相同的shape和不同的channel通道数。于是,这些输出最后可在channel维度进行合并。例如:28×28×64,28×28×128,28×28×32,28×28×32。通道合并层的shape:28×28×256(64+128+32+32)。

举例分析加入1*1卷积核设计的好处:

假设输入时256个feature map进来,256个feature map输出,假设Inception层只执行3x3的卷积,那么这就需要执行 (256x256) x (3x3) 次乘法(大约589,000次计算操作)。现在Bottleneck layer的思想是先来减少特征的数量,我们首先执行256 -> 64 的1×1卷积,然后在所有Bottleneck layer的分支上对64大小的feature map进行卷积,最后再64 -> 256 1x1卷积。

操作量是:

256×64 × 1×1 = 16,384      64x1x1卷积核对上一层输出卷积计算

64×256 × 3×3= 147456      256x3x3卷积核对1x1卷积输出进行卷积计算

总共约163840,而我们以前有近600,000。减少3倍多的操作。

layer设计


GoogLeNet是作者团队在参加2014大规模视觉挑战赛时送去参加的几种Inception结构的模型之一。该网络设计时考虑了计算效率和实用性,故可以在单个设备上运行推理,对低内存设备比较友好。整个网络使用了9个Inception块,结构排布如表格中所示:

e75f0d3ac974f778069cca2f9569683a.jpg

训练方法


模型训练采用了DistBelief分布式机器学习系统对GoogleNet进行了训练(CPU)。论文表示使用高端GPU,可以在1周内完成模型的训练。训练采用了0.9动量的异步随机梯度下降,固定学习率(每8个迭代学习率降低4%),另外使用各个各个尺寸的图片(数据增强)对于降低过拟合很有用。

总结&实验结果


作者在论文中表示,用现有的dense结构来组合构建出最佳的稀疏结构,是改善计算机视觉神经网络的可行方法。与较浅和较窄的网络结构相比,该方法的优点在于计算量适度增加的情况下显著提高网络效果。在目标检测领域,尽管没有利用上下文和bounding box回归,我们的效果还是很好,进一步表面Inception结构的优越性,未来将在此基础上继续研究更加精细和自动化地方式来创造稀疏结构用以促进各领域的工作。

e1852f18c81e074feff7c9e5e41bb999.png

代码实现如下图的GoogLenet网络


a13c2d65ade5c42e7342d1e598ef0b70.png

构建Inception基本模块

class Inception(nn.Module):
    # c1 - c4为每条线路里的层的输出通道数
    def __init__(self, in_c, c1, c2, c3, c4):
        super(Inception, self).__init__()
        # 线路1,单1 x 1卷积层
        self.p1_1 = nn.Conv2d(in_c, c1, kernel_size=1)
        # 线路2,1 x 1卷积层后接3 x 3卷积层
        self.p2_1 = nn.Conv2d(in_c, c2[0], kernel_size=1)
        self.p2_2 = nn.Conv2d(c2[0], c2[1], kernel_size=3, padding=1)
        # 线路3,1 x 1卷积层后接5 x 5卷积层
        self.p3_1 = nn.Conv2d(in_c, c3[0], kernel_size=1)
        self.p3_2 = nn.Conv2d(c3[0], c3[1], kernel_size=5, padding=2)
        # 线路4,3 x 3最大池化层后接1 x 1卷积层
        self.p4_1 = nn.MaxPool2d(kernel_size=3, stride=1, padding=1)
        self.p4_2 = nn.Conv2d(in_c, 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)  # 在通道维上连结输出
总体实现
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))
b2 = nn.Sequential(nn.Conv2d(64, 64, kernel_size=1),
                   nn.Conv2d(64, 192, kernel_size=3, padding=1),
                   nn.MaxPool2d(kernel_size=3, stride=2, padding=1))
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))
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))
b5 = nn.Sequential(Inception(832, 256, (160, 320), (32, 128), 128),
                   Inception(832, 384, (192, 384), (48, 128), 128),
                   d2l.GlobalAvgPool2d())
net = nn.Sequential(b1, b2, b3, b4, b5, 
                    d2l.FlattenLayer(), nn.Linear(1024, 10))
net = nn.Sequential(b1, b2, b3, b4, b5, d2l.FlattenLayer(), nn.Linear(1024, 10))
X = torch.rand(1, 1, 96, 96)
for blk in net.children(): 
    X = blk(X)
    print('output shape: ', X.shape)
#batchsize=128
batch_size = 16
# 如出现“out of memory”的报错信息,可减小batch_size或resize
#train_iter, test_iter = d2l.load_data_fashion_mnist(batch_size, resize=96)
lr, num_epochs = 0.001, 5
optimizer = torch.optim.Adam(net.parameters(), lr=lr)
d2l.train_ch5(net, train_iter, test_iter, batch_size, optimizer, device
相关文章
|
7月前
|
机器学习/深度学习 PyTorch TensorFlow
卷积神经网络深度解析:从基础原理到实战应用的完整指南
蒋星熠Jaxonic,深度学习探索者。深耕TensorFlow与PyTorch,分享框架对比、性能优化与实战经验,助力技术进阶。
|
8月前
|
传感器 机器学习/深度学习 算法
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
【UASNs、AUV】无人机自主水下传感网络中遗传算法的路径规划问题研究(Matlab代码实现)
200 0
|
8月前
|
机器学习/深度学习 资源调度 算法框架/工具
AI-ANNE: 将神经网络迁移到微控制器的深度探索——论文阅读
AI-ANNE框架探索将深度学习模型迁移至微控制器的可行路径,基于MicroPython在Raspberry Pi Pico上实现神经网络核心组件,支持本地化推理,推动TinyML在边缘设备中的应用。
455 10
|
8月前
|
机器学习/深度学习 传感器 算法
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
【无人车路径跟踪】基于神经网络的数据驱动迭代学习控制(ILC)算法,用于具有未知模型和重复任务的非线性单输入单输出(SISO)离散时间系统的无人车的路径跟踪(Matlab代码实现)
514 2
|
7月前
|
机器学习/深度学习 数据采集 存储
概率神经网络的分类预测--基于PNN的变压器故障诊断(Matlab代码实现)
概率神经网络的分类预测--基于PNN的变压器故障诊断(Matlab代码实现)
1001 0
|
7月前
|
机器学习/深度学习 人工智能 算法
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
【基于TTNRBO优化DBN回归预测】基于瞬态三角牛顿-拉夫逊优化算法(TTNRBO)优化深度信念网络(DBN)数据回归预测研究(Matlab代码实现)
286 0
|
8月前
|
机器学习/深度学习 缓存 算法
2025年华为杯A题|通用神经网络处理器下的核内调度问题研究生数学建模|思路、代码、论文|持续更新中....
2025年华为杯A题|通用神经网络处理器下的核内调度问题研究生数学建模|思路、代码、论文|持续更新中....
640 1
|
7月前
|
传感器 机器学习/深度学习 数据采集
【航空发动机寿命预测】基于SE-ResNet网络的发动机寿命预测,C-MAPSS航空发动机寿命预测研究(Matlab代码实现)
【航空发动机寿命预测】基于SE-ResNet网络的发动机寿命预测,C-MAPSS航空发动机寿命预测研究(Matlab代码实现)
483 0
|
算法 测试技术 C语言
深入理解HTTP/2:nghttp2库源码解析及客户端实现示例
通过解析nghttp2库的源码和实现一个简单的HTTP/2客户端示例,本文详细介绍了HTTP/2的关键特性和nghttp2的核心实现。了解这些内容可以帮助开发者更好地理解HTTP/2协议,提高Web应用的性能和用户体验。对于实际开发中的应用,可以根据需要进一步优化和扩展代码,以满足具体需求。
1291 29
|
前端开发 数据安全/隐私保护 CDN
二次元聚合短视频解析去水印系统源码
二次元聚合短视频解析去水印系统源码
528 4

热门文章

最新文章

推荐镜像

更多
  • DNS