GoogLeNet学习笔记
1.简介
提升神经网络性能的最直接方法就是增大size,包括增加深度以及每一层的神经元数。但这样做有两个主要的缺点:(1)参数过多,当训练数据不大时,模型容易出现过拟合。(2)计算量大,越多的参数需要越多的计算资源。而且增加的神经元还有可能是无效的。
那么,能避免上述两个缺点呢?上述两个问题的根源在于参数太过密集(如AlexNet、VGGNet)所以解决方法是引入稀疏性并且用稀疏结构代替全连接层(并非完全弃用全连接层,只是尽可能少用)。
然而,当前的计算设备面对非格式化的稀疏数据时,计算是非常低效的。卷积可以看成是一种密集计算,加入随机性和稀疏连接来打破对称性,以此提升学习,但密集性能够充分利用GPU的密集计算、并行计算。所以就问:有没有一种结构,既能使用稀疏性,又能充分利用当前硬件的密集矩阵计算?那就是Inception,它是构成GoogLeNet的基础模块。
2.Inception
Inception作为一个整体模块,输入、输出均是一条通路,内部则分为4路,对应4个操作,分别是1*1卷积、3*3卷积、5*5卷积、3*3最大池化,模块的输入分别通过这4个操作,然后再将4个操作的结果在通道方向上堆叠在一起,作为整个模块的输出。因此,这4路输出的size必须要相同,否则无法堆叠,故需要通过调整stride核padding使得经过这4个操作之后的输出的size均相同。
为何使用3个卷积核?根据“视觉信息应该在不同的scale中进行处理,然后聚集在一起,以此使得下一个stage能够同时从不同的scale中抽象出特征”,Inception使用了三种不同size的卷积核进行特征提取,然后聚集在一起。
为何使用1个池化操作?是因为池化操作对于目前卷积网络的成功至关重要,因此建议在每个Inception中添加一个并行池化,采用步长为2的最大池化层将网络分辨率减半,应该也应该具有额外的效果。
因此Inception的初始结构如下:
初始结构有个问题就是,直接在通道方向上进行堆叠,导致通道数太多了,而且越往后传递,通道只会越来越多。所以必须要解决这个问题,办法就是引入1*1的卷积核进行降维。在4个分支的操作中,1*1卷积操作不需要再引入多一个1*1卷积了,只需调整通道数即可;对于3*3和5*5的卷积操作,在他们之前就进行1*1卷积操作,从而降低维度(在操作之前降维,既能实现降维,又能降低计算量);对于3*3的最大池化,先进行池化操作,再进行1*1卷积降维,but why?为什么要在操作之后再降维?
最后的Inception模块如下图:
3.GoogLeNet
GoogLeNet就是用Inception堆叠起来的一个非常深的神经网络,结构复杂,但其参数却只有AlexNet的1/12,因为它是一个稀疏结构,避免了参数庞大全连接层(有全连接层,但参数不会太多)。
如此深的网络,反向传播梯度到所有层是一个很大的问题(前面的层很难传播到)。因此,在网络中间加入了两个辅助分类器,主要用于产生梯度,使得前中层的参数也能够得到更新。在训练时,这两个分类器也加入到损失函数的计算当中(权值设置为为0.3),测试时这两个辅助分类器不需要了,直接去掉就可以了。
posted on 2020-07-25 11:26 ZhicongHou 阅读(109) 评论(0) 编辑 收藏 举报