1998 Lenet5,由于算力,AI当时没有获得很大的发展
Alexnet 2012,第一个得到广泛关注。增加了网络深度,采用RELU激活函数,drop技巧
vgg16 2014, 泛化性能很好,常用于目标检测,图像分类任务。 发现网络不断加深,可以提升网络性能
Resnet 2015 解决纯粹提升网络深度带来的问题,为了让网络更深
Inception 2014:让网络更宽,尤其是不增加硬件成本的基础上
Resnet网络在一定程度上解决了增加网络深度带来的梯度爆炸、梯度消失的问题,可以让网络加深到50层,101层,甚至更深。而另一个角度,增加网络宽度,也是一个很好的方式。
Inception网络最核心的是Inception模块,通过很多Inception模块组成了Google公司发明的GoogleNet。 后面以Net结尾,这样命名是为了向早期的Lenet-5网络进行致敬。
Inception网络与vgg网络是同一年出现的,Vgg网络是当年挑战赛分类任务的第二名,而第一名就是Inception网络。
Resnet网络最核心的是残差模块。而Inception网络最核心的是Inception模块。
传统的卷积神经网络中,每一层网络都会从前一层网络中提取信息,以便将输入数据转化为更有用的信息。其中,起到很重要作用的就是卷积层。但如何设计卷积层呢?比如卷积核的大小,步长的大小,应该怎么规划呢?
比如之前提到,Lenet-5网络的卷积核都是5*5大小; Alexnet卷积核大小则是11*11,3*3以及5*5; Vgg网络卷积核通常是1*1,3*3大小;Resenet卷积核大小是1*1,3*3。
不同的研究者也在不断的摸索使用不同大小的卷积核进行实践,比如1*1、3*3、5*5,有如此多的选择也会带来麻烦,到底应该选择哪一种卷积呢?而且在网络的不同层,选择哪种卷积核可以提供最有用的信息呢?
既然是训练神经网络,可不可以通过训练,让模型自己去选择哪种卷积核,自己去调整呢?
比如输入矩阵的尺寸是28*28*192,为了便于观察,横着通道的尺寸是192,在设计结构时,研究者先采用了32个 1*1*192的same卷积,得到28*28*32的输出结果。
然后再使用64个3*3*192的same卷积,同样可以得到28*28*64的矩阵,并将得到的矩阵连接到前面的结果上
再使用了1*1,3*3的卷积之后,作者又使用了30个5*5*192的same卷积,并将得到的28*28*30的矩阵连接到后面
同样,作者研究中发现max-pooling方式很有效,因此最下面,将3*3的池化层也连接起来。不过要注意,这里输出的池化层,因为需要与前面的输出矩阵连接起来,所以也需要是28*28大小,所以这里池化时,与same卷积一样,会采用same池化的方式,对输入矩阵进行padding,填充之后再进行池化
设计这样的模块,完美的解决了上面的选择困难症,再同一层中,将1*1,3*3,5*5以及池化操作都加上,最好将各个输出矩阵连接起来。这样的好处是让网络自己去抉择,如果不喜欢哪个过滤器,训练时就会调整该过滤器相关的参数,能消除或减弱该过滤器的影响力
但是这样的设计也会带来一个很大的问题,因为只是简单粗暴的堆叠在一起,这样造成网络计算量会很大。
比如,我们将其中的3*3卷积提取出来,因为输出的矩阵是28*28*64,通过多维卷积操作可知,输出矩阵每个位置上的信息都是输入矩阵和卷积核的计算结果,如果输出矩阵是28*28*1,我们需要经过28*28,再乘3*3*192 等于 135472的计算量。但是输出的矩阵是28*28*64,因此还需要*64, 共86704128.
这只是一种卷积核,网络中还有1*1,5*5等卷积核,而且这仅仅是一个inception模块,如果是多个模块,计算量将很惊人。是否有办法降低计算量呢?
如何在不增加计算成本的基础上扩展网络?
这里不将直接用3*3*192的卷积核进行卷积,而是将其拆分开,先添加了10个1*1*192的same卷积,这样就可以得到一个28*28*10的矩阵。 再用64个3*3*10的same卷积,这样操作后,最终得到的还是28*28*64的输出矩阵。和前面直接用3*3*192的卷积核卷积的结果一样。
前面的计算量是28*28*10通过1*1*192的卷积核得到,计算量是1505280
后面一半的计算量:28*28*64 * 3*3*10 = 4515840
将两者的计算量,总计算量是6021120.
得到相同输出矩阵的情况下,计算量只是前面(86704128)的1/13
使用1*1的卷积是否会影响神经网络的性能?事实证明,只要使用的得当,是不会影响的。即使有一点点影响,这样的改造也很有意义,因为计算力就相当于金钱,减少算力可以带来硬件投入的节约。
进化版本的Inception
从输入矩阵入手,原来1*1*192的卷积方式不变,还是可以得到28*28*32的矩阵。
原来3*3的卷积方式,我们在前面增加一个1*1的卷积,降低它的计算量。
原本5*5的卷积,也在前面增加1*1的卷积,降低这一部分的计算量
最下面的池化操作,在池化操作之后可以得到28*28*192的矩阵。但是第三个通道192还是很多,因此我们也加上1*1的卷积,将通道数缩小,最终变成28*28*38的矩阵
将这些输出矩阵连接起来,最后的总和仍然是28*28*164的大矩阵,但是和之前的网络相比,此时的计算量已经大大降低。
上面为平面化的结构图,便于观察
将这些inception模块组合起来,就构成Googlenet网络
整个网络看起来很复杂。但对网络进行拆解,就会发现主干网络有很多的inception模块,不然上面方框内的都是inception模块。 图片输入网络后,经过一系列的inception操作,最后加上全连接层、softmax层 就可以得到输出信息。
因此,googlenet就是由inception模块,不断重叠组成的网络。
随着深度学习的发展,inception网络家族也不断发展。 前面介绍是基于Inception v1
创新点1: 采用了4种不同的过滤器。让网络自主选择偏重哪种过滤器,可以增加网络灵活性和复杂性。但如果只是简单粗暴的增加过滤器,会大大增加网络计算量,因此为了降低计算量,又使用了第二个创新点
创新点2:在不同的卷积或池化后面,使用1*1的卷积降维,减少计算量。这样降低计算成本的同时又增加了网络的深度和宽度,让网络性能变得越来越好。