首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
推荐学习书目
Learn Python the Hard Way
Python 学习手册
Python Cookbook
Python 基础教程
Python Sites
PyPI - Python Package Index
http://www.simple-is-better.com/
http://diveintopython.org/toc/index.html
Pocoo
值得关注的项目
PyPy
Celery
Jinja2
Read the Docs
gevent
pyenv
virtualenv
Stackless Python
Beautiful Soup
结巴中文分词
Green Unicorn
Sentry
Shovel
Pyflakes
pytest
Python 编程
pep8 Checker
Styles
PEP 8
Google Python Style Guide
Code Style from The Hitchhiker's Guide
V2EX  ›  Python

积神经网络 GoogLeNet

  •  
  •   MoModel · 28 天前 · 894 次点击

    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 卷积,如下所示:
    image.png
    计算的次数 
           使用 1×1 卷积:
    image.png
    1×1 卷积操作计算的次数 
    5×5 卷积操作计算的次数
    总的计算次数  远小于

    2.2 Inception Module

    原始 Inception 模块(初级版本,没有 1×1 卷积)如下:
    image.png
           该结构将 CNN 中常用的卷积( 1x1,3x3,5x5 )、池化操作( 3x3 )堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。
    网络卷积层中的网络能够提取输入的每一个细节信息,同时 5x5 的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个 ReLU 操作,以增加网络的非线性特征。
           然而这个 Inception 原始版本,所有的卷积核都在上一层的所有输出上来做,而那个 5x5 的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在 3x3 前、5x5 前、max pooling 后分别加上了 1x1 的卷积核,以起到了降低特征图厚度的作用,这也就形成了 Inception v1 的网络结构,如下图所示:
    image.png

    2.3 全局平均池化

    image.png
           以前在网络末端使用完全连接( 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 的权重加到总损失。用于对抗梯度消失问题,和提供正则化。

    3. GoogLeNet 模型

    141544_FfKB_876354.jpg
    对上图说明如下:
    ( 1 ) GoogLeNet 采用了模块化的结构( Inception 结构),方便增添和修改;
    ( 2 )网络最后采用了 average pooling (平均池化)来代替全连接层,该想法来自 NIN ( Network in Network ),事实证明这样可以将准确率提高 0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整;
    ( 3 )虽然移除了全连接,但是网络中依然使用了 Dropout ;
    ( 4 )为了避免梯度消失,网络额外增加了 2 个辅助的 softmax 用于向前传导梯度(辅助分类器)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重( 0.3 )加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号,也提供了额外的正则化,对于整个网络的训练很有裨益。而在实际测试的时候,这两个额外的 softmax 会被去掉。
    GoogLeNet 的网络结构图细节:141605_c1XW_876354.png注:上表中的“#3x3 reduce ”,“#5x5 reduce ”表示在 3x3,5x5 卷积操作之前使用了 1x1 卷积的数量。
    GoogLeNet 网络结构明细表解析如下:
    0、输入
    原始输入图像为 224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
    1、第一层(卷积层)
    使用 7x7 的卷积核(滑动步长 2,padding 为 3 ),64 通道,输出为 112x112x64,卷积后进行 ReLU 操作
    经过 3x3 的 max pooling (步长为 2 ),输出为((112 - 3+1)/2)+1=56,即 56x56x64,再进行 ReLU 操作
    3、第二层(卷积层)
    使用 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 联系我们。
    项目源码地址:https://momodel.cn/explore/5d258bfa1afd942ff7b1f521?type=app
           总结一下 GoogLeNet 的主要贡献:

    • 提出 Inception 模块并对其优化
    • 取消全连接层
    • 运用辅助分类器加速网络收敛

    5. 参考资料

    论文:https://arxiv.org/abs/1409.4842
    博客:https://blog.csdn.net/Quincuntial/article/details/76457409
    数据集:http://www.robots.ox.ac.uk/~vgg/data/flowers/17/
    博客:https://my.oschina.net/u/876354/blog/1637819
    博客:https://medium.com/coinmonks/paper-review-of-googlenet-inception-v1-winner-of-ilsvlc-2014-image-classification-c2b3565a64e7

    关于我们

    Mo(网址:momodel.cn)是一个支持 Python 的人工智能在线建模平台,能帮助你快速开发、训练并部署模型。


    Mo 人工智能俱乐部 是由网站的研发与产品设计团队发起、致力于降低人工智能开发与使用门槛的俱乐部。团队具备大数据处理分析、可视化与数据建模经验,已承担多领域智能项目,具备从底层到前端的全线设计开发能力。主要研究方向为大数据管理分析与人工智能技术,并以此来促进数据驱动的科学研究。

    目前俱乐部每周六在杭州举办以机器学习为主题的线下技术沙龙活动,不定期进行论文分享与学术交流。希望能汇聚来自各行各业对人工智能感兴趣的朋友,不断交流共同成长,推动人工智能民主化、应用普及化。
    image.png

    1 回复  |  直到 2019-07-22 00:39:35 +08:00
        1
    dalieba   28 天前 via Android
    你这的 LaTeX 公式是咋打出来的?
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   2561 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 22ms · UTC 12:56 · PVG 20:56 · LAX 05:56 · JFK 08:56
    ♥ Do have faith in what you're doing.