GoogleNet到目前为止一共四个版本,论文下载地址:
【v1】Going Deeper with Convolutions
【v2】Batch Normalization: Accelerating Deep Network Training by Reducing Internal Covariate Shift
【v3】Rethinking the Inception Architecture for Computer Vision
【v4】Inception-v4, Inception-ResNet and the Impact of Residual Connections on Learning
-
CNN的发展
先引入一张CNN结构演化图:
2012年AlexNet提出以来一直到GoogleNet提出之前,人们进行的工作就是对网络的深度(网络的层数)和宽度进行调参,但是纯粹增大网络有一下缺点:
1)参数太多,网络的计算量越大,网络的计算速度变慢,对硬件的要求变大。
2)网络层数越多就是筛选越符合目标函数的权值,容易过拟合
3)神经网络采用随机梯度下降的方式进行优化和拟合loss函数,网络越深梯度越容易消失(梯度爆炸是指:在BP过程中是通过对loss求偏导进行参数的更改,例如 如果f1大于1那么多层次的偏导时就会产生梯度爆炸。反之小于1多层结果就会很小,就是梯度消失)
Inception的tich提出解决了上述的难题
-
Inception V1模型
Inception v1的网络,将1x1,3x3,5x5的conv和3x3的pooling,堆叠在一起,一方面增加了网络的width,另一方面增加了网络对尺度的适应性;
上图是论文中提出的最原始的版本,所有的卷积核都在上一层的所有输出上来做,那5×5的卷积核所需的计算量就太大了,造成了特征图厚度很大。为了避免这一现象提出的inception具有如下结构,在3x3前,5x5前,max pooling后分别加上了1x1的卷积核起到了降低特征图厚度的作用,也就是Inception v1的网络结构。
下面解释一下改进:
假设previous layer的大小为28*28*192,则,
a的weights大小,1*1*192*64+3*3*192*128+5*5*192*32=387072
a的输出featuremap大小,28*28*64+28*28*128+28*28*32+28*28*192=28*28*416
b的weights大小,1*1*192*64+(1*1*192*96+3*3*96*128)+(1*1*192*16+5*5*16*32)+1*1*192*32=163328
b的输出feature map大小,28*28*64+28*28*128+28*28*32+28*28*32=28*28*256
写到这里,不禁感慨天才般的1*1 conv,从上面的数据可以看出一方面减少了weights,另一方面降低了dimension。
Inception V2 模型
Inception v2的网络,代表作为加入了BN(Batch Normalization)层,并且使用2个3*3替代1个5*5卷积的改进版GoogleNet。
Inception v2的亮点总结如下:
(1)加入了BN层,减少了InternalCovariate Shift(内部neuron的数据分布发生变化),使每一层的输出都规范化到一个N(0, 1)的高斯,从而增加了模型的鲁棒性,可以以更大的学习速率训练,收敛更快,初始化操作更加随意,同时作为一种正则化技术,可以减少dropout层的使用。
(2)用2个连续的3*3 conv替代inception模块中的5*5,从而实现网络深度的增加,网络整体深度增加了9层,缺点就是增加了25%的weights和30%的计算消耗。
Inception V3 模型
Inception v3网络,主要在v2的基础上,提出了卷积分解(Factorization),代表作是Inceptionv3版本的GoogleNet。
Inception v3的亮点总结如下:
(1) 将7*7分解成两个一维的卷积(1*7,7*1),3*3也是一样(1*3,3*1),这样的好处,既可以加速计算(多余的计算能力可以用来加深网络),又可以将1个conv拆成2个conv,使得网络深度进一步增加,增加了网络的非线性,更加精细设计了35*35/17*17/8*8的模块。
(2)增加网络宽度,网络输入从224*224变为了299*299。
Inception V4模型
Inception v4主要利用残差连接(Residual Connection)来改进v3结构,代表作为,Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4
resnet中的残差结构如下,这个结构设计的就很巧妙,简直神来之笔,使用原始层和经过2个卷基层的feature map做Eltwise。Inception-ResNet的改进就是使用上文的Inception module来替换resnet shortcut中的conv+1*1 conv。
(1)将Inception模块和ResidualConnection结合,提出了Inception-ResNet-v1,Inception-ResNet-v2,使得训练加速收敛更快,精度更高。
(2)设计了更深的Inception-v4版本,效果和Inception-ResNet-v2相当。
(3)网络输入大小和V3一样,还是299*299