1. 介绍
咱们以前已经讲解过 AlexNet,在这个基础上咱们来学习一下 GoogLeNet。 GoogLeNet 得到了 2014 年 ImageNet 挑战赛 (ILSVRC14) 的第一名。那么 GoogLeNet 是如何提高网络性能的呢?
通常来讲,提高网络性能最直接的办法就是增长网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在如下问题:
(1)参数太多,若是训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越日后穿越容易消失),难以优化模型。
解决这些问题的方法固然就是在增长网络深度和宽度的同时减小参数,为了减小参数,天然就想到将全链接变成稀疏链接。可是在实现上,全链接变成稀疏链接后实际计算量并不会有质的提高,由于大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,可是计算所消耗的时间却很难减小。
那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献代表能够将稀疏矩阵聚类为较为密集的子矩阵来提升计算性能,就如人类的大脑是能够看作是神经元的重复堆积,所以,GoogLeNet 团队提出了 Inception 网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。 前端
2. 网络结构特征
2.1 1×1 Convolution
1x1 卷积的主要目的是为了减小维度,还用于修正线性激活(ReLU)。在 GoogLeNet 中,1×1 卷积用做降维模块以减小计算。经过减小计算瓶颈,能够增长深度和宽度。
咱们经过一个小例子来解释一下:
假设咱们须要在不使用 1×1 卷积的状况下执行 5×5 卷积,以下所示:
微信
计算的次数
使用 1×1 卷积:
1×1 卷积操做计算的次数
5×5 卷积操做计算的次数
总的计算次数
远小于
。
2.2 Inception Module
原始 Inception 模块(初级版本,没有 1×1 卷积)以下:
网络
该结构将 CNN 中经常使用的卷积(1x1,3x3,5x5)、池化操做(3x3)堆叠在一块儿(卷积、池化后的尺寸相同,将通道相加),一方面增长了网络的宽度,另外一方面也增长了网络对尺度的适应性。
网络卷积层中的网络可以提取输入的每个细节信息,同时 5x5 的滤波器也可以覆盖大部分接受层的的输入。还能够进行一个池化操做,以减小空间大小,下降过分拟合。在这些层之上,在每个卷积层后都要作一个 ReLU 操做,以增长网络的非线性特征。
然而这个 Inception 原始版本,全部的卷积核都在上一层的全部输出上来作,而那个 5x5 的卷积核所需的计算量就太大了,形成了特征图的厚度很大,为了不这种状况,在 3x3 前、5x5 前、max pooling 后分别加上了 1x1 的卷积核,以起到了下降特征图厚度的做用,这也就造成了 Inception v1 的网络结构,以下图所示:
2.3 全局平均池化
之前在网络末端使用彻底链接(FC)层,例如在 AlexNet 中全部输入都链接到每一个输出,权重的数量
。
在 GoogLeNet 中,经过将每一个特征映射从 7×7 到 1×1 平均,几乎在网络末端使用全局平均池,如上图所示,权重的数量
。做者发现,从 FC 层到平均池的迁移将 top-1 精度提升了约 0.6%。此举也有利于减小过拟合的发生。
2.4 辅助分类器
网络中间引入了 softmax 分支,这些分支是辅助分类器,由 5×5 Average,Pooling (Stride 3),1×1 Conv (128 filters),1024 FC,1000 FC,Softmax 构成。它们只在训练的时候用到,测试的时候不用。损失以 0.3 的权重加到总损失。用于对抗梯度消失问题,和提供正则化。 app
3. GoogLeNet 模型
对上图说明以下:
(1)GoogLeNet 采用了模块化的结构(Inception 结构),方便增添和修改;
(2)网络最后采用了 average pooling(平均池化)来代替全链接层,该想法来自 NIN(Network in Network),事实证实这样能够将准确率提升 0.6%。可是,实际在最后仍是加了一个全链接层,主要是为了方便对输出进行灵活调整;
(3)虽然移除了全链接,可是网络中依然使用了 Dropout ;
(4)为了不梯度消失,网络额外增长了 2 个辅助的 softmax 用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用做分类,并按一个较小的权重(0.3)加到最终分类结果中,这样至关于作了模型融合,同时给网络增长了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练颇有裨益。而在实际测试的时候,这两个额外的 softmax 会被去掉。
GoogLeNet 的网络结构图细节:
注:上表中的“#3x3 reduce”,“#5x5 reduce”表示在 3x3,5x5 卷积操做以前使用了 1x1 卷积的数量。
GoogLeNet 网络结构明细表解析以下:
0、输入
原始输入图像为 224x224x3,且都进行了零均值化的预处理操做(图像每一个像素减去均值)。
一、第一层(卷积层)
使用 7x7 的卷积核(滑动步长 2,padding 为 3),64 通道,输出为 112x112x64,卷积后进行 ReLU 操做
通过 3x3 的 max pooling(步长为 2),输出为((112 - 3+1)/2)+1=56,即 56x56x64,再进行 ReLU 操做
三、第二层(卷积层)
使用 3x3 的卷积核(滑动步长为 1,padding 为 1),192 通道,输出为 56x56x192,卷积后进行 ReLU 操做
通过 3x3 的 max pooling(步长为 2),输出为((56 - 3+1)/2)+1=28,即 28x28x192,再进行 ReLU 操做
3a、第三层(Inception 3a层)
分为四个分支,采用不一样尺度的卷积核来进行处理
(1)64 个 1x1 的卷积核,而后 ReLU ,输出 28x28x64
(2)96 个 1x1 的卷积核,做为 3x3 卷积核以前的降维,变成 28x28x96,而后进行 ReLU 计算,再进行 128 个 3x3 的卷积(padding 为 1),输出 28x28x128
(3)16 个 1x1 的卷积核,做为 5x5 卷积核以前的降维,变成 28x28x16,进行 ReLU 计算后,再进行 32 个 5x5 的卷积(padding 为 2),输出 28x28x32
(4)pool 层,使用 3x3 的核(padding 为 1),输出 28x28x192,而后进行 32 个 1x1 的卷积,输出 28x28x32。
将四个结果进行链接,对这四部分输出结果的第三维并联,即 64+128+32+32=256,最终输出 28x28x256
3b、第三层(Inception 3b层)
(1)128 个 1x1 的卷积核,而后 ReLU,输出 28x28x128
(2)128 个 1x1 的卷积核,做为 3x3 卷积核以前的降维,变成 28x28x128,进行 ReLU,再进行 192 个 3x3 的卷积(padding 为 1),输出 28x28x192
(3)32 个 1x1 的卷积核,做为 5x5 卷积核以前的降维,变成 28x28x32,进行 ReLU 计算后,再进行 96 个 5x5 的卷积(padding 为 2),输出 28x28x96
(4)pool 层,使用 3x3 的核(padding 为 1),输出 28x28x256,而后进行 64 个 1x1 的卷积,输出 28x28x64。
将四个结果进行链接,对这四部分输出结果的第三维并联,即 128+192+96+64=480,最终输出输出为 28x28x480
第四层(4a,4b,4c,4d,4e)、第五层(5a,5b)……,与 3a、3b 相似,在此就再也不重复。
4. 总结与展望
目前,您能够在 Mo 平台中找到基于 GoogLeNet 模型实现的 17 种花卉识别的 Flower 项目。您在学习的过程当中,遇到困难或者发现咱们的错误,能够经过 Mo 平台或微信公众号 MomodelAI 联系咱们。
项目源码地址:momodel.cn/explore/5d2…
总结一下 GoogLeNet 的主要贡献:机器学习
- 提出 Inception 模块并对其优化
- 取消全链接层
- 运用辅助分类器加速网络收敛
5. 参考资料
论文:arxiv.org/abs/1409.48…
博客:blog.csdn.net/Quincuntial…
数据集:www.robots.ox.ac.uk/~vgg/data/f…
博客:my.oschina.net/u/876354/bl…
博客:medium.com/coinmonks/p…ide
关于咱们
Mo(网址:momodel.cn)是一个支持 Python 的人工智能在线建模平台,能帮助你快速开发、训练并部署模型。模块化
Mo 人工智能俱乐部 是由网站的研发与产品设计团队发起、致力于下降人工智能开发与使用门槛的俱乐部。团队具有大数据处理分析、可视化与数据建模经验,已承担多领域智能项目,具有从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析与人工智能技术,并以此来促进数据驱动的科学研究。性能
目前俱乐部每周六在杭州举办以机器学习为主题的线下技术沙龙活动,不按期进行论文分享与学术交流。但愿能汇聚来自各行各业对人工智能感兴趣的朋友,不断交流共同成长,推进人工智能民主化、应用普及化。
学习