浅谈深度神经网络 — GoogLeNet

GoogLeNet


GoogLeNet网络

GoogLeNet是2014年Christian Szegedy提出的一种全新的深度学习结构,ImageNet-2014竞赛第一。在这之前的AlexNet、VGG等结构都是通过增大网络的深度(层数)来获得更好的训练效果,但层数的增加会带来很多负作用,比如overfit、梯度消失、梯度爆炸等。inception的提出则从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。

进化顺序: InceptionV1 -> InceptionV2 -> InceptionV3 -> InceptionV4
为了提升网络的性能,深度网络的发展一般都是通过减少参数,降低计算,增加宽度、深度来提高网络的性能。GoogLeNet网络的深度、宽度也在增加,从V1到V4Inception网络在不断的完善。

  • 宽度:增加了多种核1×1,3×3,5×5和max pooling,增加网络的厚度,也就是宽度,但是考虑到简单的拼接到一起的话参数太多,计算量的问题,在,3×3,5×5和max pooling前加入了1×1的卷积核,以起到降低输入特征网络的厚度,通过降维这样就可以起到降低计算量的作用。

-> InceptionV1

核心组件Inception Architecture(稀疏连接结构)

① 提供多尺度特征:输出通道多尺度化(感受野

  • 首个Split-Merge思想
  • 串接合并所有分支输出

Bottleneck Layer 的 1×1 卷积解决多尺度带来的高额参数及计算问题

V1结构

通过设计一个稀疏网络结构,但是能够产生稠密的数据,既能增加神经网络表现,又能保证计算资源的使用效率。谷歌作者提出了最原始Inception的基本结构:

结构说明:
1 . 采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合。
2 . 之所以卷积核大小采用1、3和5,主要是为了方便对齐。设定卷积步长stride=1之后,只要分别设定pad=0、1、2,那么卷积之后便可以得到相同维度的特征,然后这些特征就可以直接拼接在一起了。
3 . 文章说很多地方都表明Pooling挺有效,所以Inception里面也嵌入了,同时Pooling池化也起到减少空间大小,降低过度拟合的作用。
4 . 网络越到后面,特征越抽象,而且每个特征所涉及的感受野也更大了,因此随着层数的增加,3x3和5x5卷积的比例也要增加。

但是在上面的结构中使用 5×5 的网络结构仍然会带来很大的计算量,因此Inception借鉴了其他的网络结构,在3×3,5×5卷积层前,Pooling池化层后加入了 1×1 卷积降维。于是有了新的网络结构:

在这里简单的讨论下1x1的卷积核有什么用呢?

1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。

GoogLeNet的整体结构如下图:

更加清晰地结构如下:

对上图做如下说明:
1 . 显然GoogLeNet采用了模块化的结构,方便增添和修改;
2 . 网络最后采用了average pooling来代替全连接层,想法来自NIN,事实证明可以将TOP1 accuracy提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便以后大家finetune;
3 . 虽然移除了全连接,但是网络中依然使用了Dropout ;
4 . 为了避免梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度。文章中说这两个辅助的分类器的loss应该加一个衰减系数,但看caffe中的model也没有加任何衰减。此外,实际测试的时候,这两个额外的softmax会被去掉。

-> InceptionV2

核心组件

Batch Normalization 批归一化(在Batch范围内,对每个特征通道分别进行归一化)

  • 解决 Internal Covariate Shift 问题(内部neuron的数据分布发生变化)
  • 白化:使每一层的出现都规范化到 N ( 0 , 1 ) N(0,1) N(0,1)
  • 允许较高学习率
  • 取代部分Dropout

    Batch Normalization 位置: 卷积 -> BN -> Relu ;另外配对使用Scale & Shift,添加一组逆算子scale乘子和bias偏置,这组参数需要学习 y ( k ) = γ ( k ) x ( k ) + β ( k ) y^{(k)}=\gamma^{(k)}x^{(k)}+ \beta ^{(k)} y(k)=γ(k)x(k)+β(k)

② 5×5 卷积核 -> 2个 3×3 卷积核

-> InceptionV3

核心组件

① 非对称卷积:N×N 分解成 1×N -> N×1

② 降低参数数量和计算量

但是GoogLeNet团队发现在网络的前期使用这种分解效果并不好,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)。

为了避免这种高效的降尺寸所带来的表达瓶颈的问题,在降尺寸前增加了特征通道。

使用卷积分支+池化分支,串接分支结果。网络机构图如下:

-> InceptionV4

V4的发展主要是,研究了Inception模块与残差连接的结合。ResNet结构大大地加深了网络深度,还极大地提升了训练速度,同时性能也有提升。

基本单元


GoogLeNet内容详细了解的话还是要查看论文综述,这里只是简单介绍下。。。

全部评论

相关推荐

会飞的猿:我看你想进大厂,我给你总结一下学习路线吧,java语言方面常规八股要熟,那些java的集合,重点背hashmap八股吧,jvm类加载机制,运行时分区,垃圾回收算法,垃圾回收器CMS、G1这些,各种乐观锁悲观锁,线程安全,threadlocal这些。在进阶一些的比如jvm参数,内存溢出泄漏排查,jvm调优。我这里说的只是冰山一角,详细八股可以去网上找,这不用去买,都免费资源。mysql、redis可以去看小林coding,我看你简历上写了,你一定要熟,什么底层b+树、索引结构、innodb、mvcc、undo log、redo log、行级锁表级锁,这些东西高频出现,如果面试官问我这些我都能笑出来。消息队列rabbitmq也好kafka也好,学一种就行,什么分区啊副本啊确认机制啊怎么保证不重复消费、怎么保证消息不丢失这些基本的一定要会,进阶一点的比如LEO、高水位线、kafka和rocketmq底层零拷贝的区别等等。计算机网络和操作系统既然你是科班应该理解起来问题不大,去看小林coding这两块吧,深度够了。spring boot的八股好好看看吧,一般字节腾讯不这么问,其他的java大厂挺爱问的,什么循环依赖啥的去网上看看。数据结构的话科班应该问题不大,多去力扣集中突击刷题吧。项目的话其实说白了还是结合八股来,想一想你写的这些技术会给你挖什么坑。除此之外,还有场景题、rpc、设计模式、linux命令、ddd等。不会的就别往简历上写了,虽然技术栈很多的话好看些,但背起来确实累。总结一下,多去实习吧,多跳槽,直到跳到一个不错的中厂做跳板,这是一条可行的进大厂的路线。另外,只想找个小厂的工作的话,没必要全都照这些准备,太累了,重点放在框架的使用和一些基础八股吧。大致路线就这样,没啥太多难度,就是量大,你能达到什么高度取决于你对自己多狠,祝好。
点赞 评论 收藏
分享
01-26 22:20
已编辑
门头沟学院 Java
Java抽象带篮子:项目很nb了,现在好好准备八股和算法吧,早点找实习,可以看看我的置顶帖子。帖子里写了怎么改简历,怎么包装实习经历,还有2个高质量可速成的项目话术,和我的牛客八股笔记专栏
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务