GoogLeNet系列解读
https://blog.csdn.net/shuzfan/article/details/50738394
本文介绍的是著名的网络结构GoogLeNet及其延伸版本,目的是试图领会其中的思想而不是单纯关注结构。
- GoogLeNet Incepetion V1
- Motivation
- Architectural Details
- GoogLeNet
- Conclusion
- GoogLeNet Inception V2
- Introduction
- General Design Principles
- Factorizing Convolutions with Large Filter Size
- 未完待续
GoogLeNet Incepetion V1
这是GoogLeNet的最早版本,出现在2014年的《Going deeper with convolutions》。之所以名为“GoogLeNet”而非“GoogleNet”,文章说是为了向早期的LeNet致敬。
Motivation
深度学习以及神经网络快速发展,人们不再只关注更给力的硬件、更大的数据集、更大的模型,而是更在意新的idea、新的算法以及模型的改进。
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,这也就意味着巨量的参数。但是,巨量参数容易产生过拟合也会大大增加计算量。
文章认为解决上述两个缺点的根本方法是将全连接甚至一般的卷积都转化为稀疏连接。一方面现实生物神经系统的连接也是稀疏的,另一方面有文献1表明:对于大规模稀疏的神经网络,可以通过分析激活值的统计特性和对高度相关的输出进行聚类来逐层构建出一个最优网络。这点表明臃肿的稀疏网络可能被不失性能地简化。 虽然数学证明有着严格的条件限制,但Hebbian准则有力地支持了这一点:fire together,wire together。
早些的时候,为了打破网络对称性和提高学习能力,传统的网络都使用了随机稀疏连接。但是,计算机软硬件对非均匀稀疏数据的计算效率很差,所以在AlexNet中又重新启用了全连接层,目的是为了更好地优化并行运算。
所以,现在的问题是有没有一种方法,既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性能,据此论文提出了名为Inception 的结构来实现此目的。
Architectural Details
Inception 结构的主要思路是怎样用密集成分来近似最优的局部稀疏结构。
作者首先提出下图这样的基本结构:
对上图做以下说明:
1 . 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合;
2 . 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了;
3 . 文章说很多地方都表明pooling挺有效,所以Inception里面也嵌入了。
4 . 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。
但是,使用5x5的卷积核仍然会带来巨大的计算量。 为此,文章借鉴NIN2,采用1x1卷积核来进行降维。
例如:上一层的输出为100x100x128,经过具有256个输出的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256。其中,卷积层的参数为128x5x5x256。假如上一层输出先经过具有32个输出的1x1卷积层,再经过具有256个输出的5x5卷积层,那么最终的输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256,大约减少了4倍。
具体改进后的Inception Module如下图:
GoogLeNet
GoogLeNet的整体结构如下图:
对上图做如下说明:
1 . 显然GoogLeNet采用了模块化的结构,方便增添和修改;
2 . 网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune;
3 . 虽然移除了全连接,但是网络中依然使用了Dropout ;
4 . 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看caffe中的model也没有加任何衰减。此外,实际测试的时候,这两个额外的softmax会被去掉。
下图是一个比较清晰的结构图:
Conclusion
GoogLeNet是谷歌团队为了参加ILSVRC 2014比赛而精心准备的,为了达到最佳的性能,除了使用上述的网络结构外,还做了大量的辅助工作:包括训练多个model求平均、裁剪不同尺度的图像做多次验证等等。详细的这些可以参看文章的实验部分。
本文的主要想法其实是想通过构建密集的块结构来近似最优的稀疏结构,从而达到提高性能而又不大量增加计算量的目的。GoogleNet的caffemodel大小约50M,但性能却很优异。
GoogLeNet Inception V2
GoogLeNet凭借其优秀的表现,得到了很多研究人员的学习和使用,因此Google团队又对其进行了进一步发掘改进,产生了升级版本的GoogLeNet。这一节介绍的版本记为V2,文章为:《Rethinking the Inception Architecture for Computer Vision》。
Introduction
14年以来,构建更深的网络逐渐成为主流,但是模型的变大也使计算效率越来越低。这里,文章试图找到一种方法在扩大网络的同时又尽可能地发挥计算性能。
首先,GoogLeNet V1出现的同期,性能与之接近的大概只有VGGNet了,并且二者在图像分类之外的很多领域都得到了成功的应用。但是相比之下,GoogLeNet的计算效率明显高于VGGNet,大约只有500万参数,只相当于Alexnet的1/12(GoogLeNet的caffemodel大约50M,VGGNet的caffemodel则要超过600M)。
GoogLeNet的表现很好,但是,如果想要通过简单地放大Inception结构来构建更大的网络,则会立即提高计算消耗。此外,在V1版本中,文章也没给出有关构建Inception结构注意事项的清晰描述。因此,在文章中作者首先给出了一些已经被证明有效的用于放大网络的通用准则和优化方法。这些准则和方法适用但不局限于Inception结构。
General Design Principles
下面的准则来源于大量的实验,因此包含一定的推测,但实际证明基本都是有效的。
1 . 避免表达瓶颈,特别是在网络靠前的地方。 信息流前向传播过程中显然不能经过高度压缩的层,即表达瓶颈。从input到output,feature map的宽和高基本都会逐渐变小,但是不能一下子就变得很小。比如你上来就来个kernel = 7, stride = 5 ,这样显然不合适。
另外输出的维度channel,一般来说会逐渐增多(每层的num_output),否则网络会很难训练。(特征维度并不代表信息的多少,只是作为一种估计的手段)
2 . 高维特征更易处理。 高维特征更易区分,会加快训练。
3. 可以在低维嵌入上进行空间汇聚而无需担心丢失很多信息。 比如在进行3x3卷积之前,可以对输入先进行降维而不会产生严重的后果。假设信息可以被简单压缩,那么训练就会加快。
4 . 平衡网络的宽度与深度。
上述的这些并不能直接用来提高网络质量,而仅用来在大环境下作指导。
Factorizing Convolutions with Large Filter Size
大尺寸的卷积核可以带来更大的感受野,但也意味着更多的参数,比如5x5卷积核参数是3x3卷积核的25/9=2.78倍。为此,作者提出可以用2个连续的3x3卷积层(stride=1)组成的小网络来代替单个的5x5卷积层,(保持感受野范围的同时又减少了参数量)如下图:
然后就会有2个疑问:
1 . 这种替代会造成表达能力的下降吗?
后面有大量实验可以表明不会造成表达缺失;
2 . 3x3卷积之后还要再加激活吗?
作者也做了对比试验,表明添加非线性激活会提高性能。
从上面来看,大卷积核完全可以由一系列的3x3卷积核来替代,那能不能分解的更小一点呢。文章考虑了 nx1 卷积核。
如下图所示的取代3x3卷积:
于是,任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。实际上,作者发现在网络的前期使用这种分解效果并不好,还有在中度大小的feature map上使用效果才会更好。(对于mxm大小的feature map,建议m在12到20之间)。
总结如下图:
(1) 图4是GoogLeNet V1中使用的Inception结构;
(2) 图5是用3x3卷积序列来代替大卷积核;
(3) 图6是用nx1卷积来代替大卷积核,这里设定n=7来应对17x17大小的feature map。该结构被正式用在GoogLeNet V2中。
未完待续
- Sanjeev Arora, Aditya Bhaskara, Rong Ge, and Tengyu Ma. Provable bounds for learning some deep representations. CoRR, abs/1310.6343, 2013. ↩
- Min Lin, Qiang Chen, and Shuicheng Yan. Network in network. CoRR, abs/1312.4400, 2013. ↩
GoogLeNet系列解读相关推荐
- 【深度学习】GoogLeNet系列解读 —— Inception v4
目录 GoogLeNet系列解读 Inception v1 Inception v2 Inception v3 Inception v4 简介 在介绍Inception v4之前,首先说明一下Ince ...
- GoogLeNet代码解读
GoogLeNet代码解读 目录 GoogLeNet代码解读 概述 GooLeNet网络结构图 1)从输入到第一层inception 2)从第2层inception到第4层inception 3)从第 ...
- 《通用数据保护条例》(GDPR)系列解读一:如何判断出海企业是否受GDPR管辖?
2018年被称为"世界数据治理元年".在这一年的5月25日,<通用数据保护条例>(GDPR)在经过两年的缓冲期后正式步入执法阶段.作为全球首部全面的个人数据保护法,它的 ...
- 从梁飞的微型rpc 细节说起--Dubbo源码系列解读(5)
7年前,梁飞公布了一个微型的rpc,这个rpc核心就是一个类,2个方法,但重点我们要探讨是细节的设计和质量一些问题 package com.rpc;import java.io.ObjectInput ...
- 大概是全网最详细的何恺明团队顶作MoCo系列解读...(完结篇)
作者丨科技猛兽 编辑丨极市平台 本文原创首发于极市平台,转载请获得授权并标明出处. 大概是全网最详细的何恺明团队顶作 MoCo 系列解读!(上) 本文目录 1 MoCo v2 1.1 MoCo v2 ...
- 【深度学习】大概是全网最详细的何恺明团队顶作MoCo系列解读...(完结篇)
作者丨科技猛兽 编辑丨极市平台 导读 kaiming 的 MoCo让自监督学习成为深度学习热门之一, Yann Lecun也在 AAAI 上讲 Self-Supervised Learning 是未来 ...
- 鸿蒙HarmonyOS应用开发系列 | 解读鸿蒙源码
本文聚合了鸿蒙源码结构分析.鸿蒙源码下载和编译相关文章,帮助大家读懂鸿蒙源码.本系列将持续更新,建议Mark. 鸿蒙OS的系统调用是如何实现的? | 解读鸿蒙源码 鸿蒙开发环境搭建.源码下载和编译 鸿 ...
- 最全阿里架构师P系列解读:P5-P8的技能要求和薪资结构
2018年持续一整年的架构设计分享,2019年我希望持续分享的同时,能真正意义上帮助到部分读者成为一名架构师. 学习的同时请千万别:只见树木,不见森林. 所以我会让大家先俯瞰完整的森林,我们再从树木开 ...
- 最全阿里技术P系列解读:P5-P8的技能要求和薪资结构
大家都熟知阿里技术的P系列,从P5-P10都有,越往上走人数越少,比较急缺的是P6-P8的岗位,以下我分别谈谈阿里Java的P6-P8的技能要求的区别,文末有阿里Java架构师进阶88期专题资料~ 一 ...
最新文章
- 24本实体书包邮免费送!
- mac svn 返回svn upgrade等出错
- Python Selenium + phantomJS 模拟登陆教务管理系统 “抢课”
- android开发中的 Activity 与 Context 区别与联系
- 在win8.1 64位系统+cocos2d-x2.2.3下搭建android交叉编译环境
- 信息安全工程师笔记-网络安全主动防御技术与应用
- 【转载】基于rasa的对话系统搭建(上)
- JS调试的时候遇到无限debugger怎么办?
- 【虚拟化实战】存储设计之二LUN Sizing
- 使用Selenium定位鼠标悬浮出现的下拉菜单
- 路由重分布 rip,eigrp,和ospf
- oracle erp 表结构
- 10款在线检查英语语法的网站
- 微商新手如何选产品?史上最详细操作指南!
- 加拿大麦吉尔大学计算机科学学院,加拿大麦吉尔大学专业:加拿大麦吉尔大学的院校介绍以及专业设置...
- android动态权限依赖库,动态申请app权限:郭霖大神的PermissionX库带你告别原生
- 高中发表在论文计算机方面,高中计算机论文
- 小数化分数(C++ 代码讲解很详细)
- 备忘录怎么完整发给别人
- 寻找解决样本不均衡方法之Focal Loss与GHM
热门文章
- linux中call命令,各种linux命令(pwn)
- Linux更改显示管理器,聊聊Linux操作系统中的显示管理器及如何更换
- qt中的纯c语言中项目,2使用QT新建c工程
- 海洋分享皮肤_王者荣耀周年庆皮肤爆料,还有一款CP皮肤?
- 招不到电子工程师,这锅谁来背?
- np读取csv文件_pandas.read_csv函数参数详解
- linux git指令不存在,一些常用的Git命令
- linux怎么取消挂在u盘,linux下如何挂载U盘
- python redis 操作_Python 使用 Redis 操作
- git 修改分支名字_大牛总结的 Git 使用技巧,写得太好了!