参考资料:
GoogLeNet论文翻译——中文版 | SnailTyan (noahsnail.com)
GoogleNet论文解读_abc_138的博客-CSDN博客_googlenet论文
GoogLeNet系列论文_坚硬果壳_的博客-CSDN博客_googlenet论文
1、引入了Inception结构(融合不同尺度的特征信息)
2、使用1*1的卷积核进行降维以及映射处理
3、添加两个辅助分类器帮助训练
4、丢弃全连接层,使用平均池化(大大减少了模型的参数)
深入解读GoogLeNet网络结构(附代码实现)_雷恩Layne的博客-CSDN博客_googlenet网络结构
我们先来看一下模型中的Inception单元结构,然后在此基础上详细分析GoogleNet网络结构。
Inception 最初提出的版本主要思想是利用不同大小的卷积核实现不同尺度的感知,网络结构图如下:
Inception Module基本组成结构有四个成分。11卷积,33卷积,55卷积,33最大池化。最后对四个成分运算结果进行通道上组合,这就是Naive Inception的核心思想:利用不同大小的卷积核实现不同尺度的感知,最后进行融合,可以得到图像更好的表征。
下面通过一个具体的实例来看看整个Naive Inception单元的详细工作过程,假设在上图中Naive Inception单元的前一层输入的数据是一个32×32×256的特征图,该特征图先被复制成4份并分别被传至接下来的4个部分。我们假设这4个部分对应的滑动窗口的步长均为1,其中,1×1卷积层的Padding为0,滑动窗口维度为1×1×256,要求输出的特征图深度为128;3×3卷积层的Padding为1,滑动窗口维度为3×3×256,要求输出的特征图深度为192;5×5卷积层的Padding为2,滑动窗口维度为5×5×256,要求输出的特征图深度为96;3×3最大池化层的 Padding为1,滑动窗口维度为3×3×256。这里对每个卷积层要求输出的特征图深度没有特殊意义,仅仅举例用,之后通过计算,分别得到这4部分输出的特征图为32×32×128、32×32×192、32×32×96 和 32×32×256,最后在合并层进行合并,得到32×32×672的特征图,合并的方法是将各个部分输出的特征图相加,最后这个Naive Inception单元输出的特征图维度是32×32×672,总的参数量就是11256128+33256192+55256*96=1089536。
但是Naive Inception有两个非常严重的问题:首先,所有卷积层直接和前一层输入的数据对接,所以卷积层中的计算量会很大;其次,在这个单元中使用的最大池化层保留了输入数据的特征图的深度,所以在最后进行合并时,总的输出的特征图的深度只会增加,这样增加了该单元之后的网络结构的计算量。于是人们就要想办法减少参数量来减少计算量,在受到了模型 “Network in Network”的启发,开发出了在GoogleNet模型中使用的Inception单元(Inception V1),这种方法可以看做是一个额外的1*1卷积层再加上一个ReLU层。如下所示:
这里使用1x1 卷积核主要目的是进行压缩降维,减少参数量,从而让网络更深、更宽,更好的提取特征,这种思想也称为Pointwise Conv,简称PW。
举个例子来论证下吧。假设新增加的 1×1 的卷积的输出深度为64,步长为1,Padding为0,其他卷积和池化的输出深度、步长都和之前在Naive Inception单元中定义的一样(即上面例子中定义的一样),前一层输入的数据仍然使用同之前一样的维度为32×32×256的特征图,通过计算,分别得到这 4 部分输出的特征图维度为32×32×128、32×32×192、32×32×96 和32×32×64,将其合并后得到维度为32×32×480的特征图,将这4部分输出的特征图进行相加,最后Inception单元输出的特征图维度是32×32×480。新增加的3个 1×1 的卷积参数量是31125664=49152,原来的卷积核参数量是11256128+3364192+5564*96=296960,总的参数量就是49152+296960=346112。
在输出的结果中,32×32×128、32×32×192、32×32×96 和之前的Naive Inception 单元是一样的,但其实这三部分因为1×1卷积层的加入,总的卷积参数数量已经大大低于之前的Naive Inception单元,而且因为在最大池化层之前也加入了1×1的卷积层,所以最终输出的特征图的深度也降低了,这样也降低了该单元之后的网络结构的计算量。
GoogLeNet网络有22层深(包括pool层,有27层深),在分类器之前,采用Network in Network中用Averagepool(平均池化)来代替全连接层的思想,而在avg pool之后,还是添加了一个全连接层,是为了大家做finetune(微调)。而无论是VGG还是LeNet、AlexNet,在输出层方面均是采用连续三个全连接层,全连接层的输入是前面卷积层的输出经过reshape得到。据发现,GoogLeNet将fully-connected layer用avg pooling layer代替后,top-1 accuracy 提高了大约0.6%;然而即使在去除了fully-connected layer后,依然必须dropout。
由于全连接网络参数多,计算量大,容易过拟合,所以GoogLeNet没有采用VGG、LeNet、AlexNet三层全连接结构,直接在Inception模块之后使用Average Pool和Dropout方法,不仅起到降维作用,还在一定程度上防止过拟合。
在Dropout层之前添加了一个7×7的Average Pool,一方面是降维,另一方面也是对低层特征的组合。我们希望网络在高层可以抽象出图像全局的特征,那么应该在网络的高层增加卷积核的大小或者增加池化区域的大小,GoogLeNet将这种操作放到了最后的池化过程,前面的Inception模块中卷积核大小都是固定的,而且比较小,主要是为了卷积时的计算方便。
GoogLeNet在网络模型方面与AlexNet、VGG还是有一些相通之处的,它们的主要相通之处就体现在卷积部分:
AlexNet采用5个卷积层
VGG把5个卷积层替换成5个卷积块
GoogLeNet采用5个不同的模块组成主体卷积部分
用表格的形式表示GoogLeNet的网络结构如下所示:
上述就是GoogLeNet的结构,可以看出,和AlexNet统一使用5个卷积层、VGG统一使用5个卷积块不同,GoogLeNet在主体卷积部分是卷积层与Inception块混合使用。另外,需要注意一下,在输出层GoogleNet采用全局平均池化,得到的是高和宽均为1的卷积层,而不是通过reshape得到的全连接层。
需要注意的是,上图中 “#3×3reduce” 和 “#5×5reduce”
表示在3×3和5×5卷积之前,使用的降维层中的1×1滤波器的数量。pool
proj代表max-pooling后的投影数量(即先max-pooling,再PW降维),所有的reductions(降维)和projections(投影)也都使用激活函数ReLU。
下面就来详细介绍一下GoogLeNet的模型结构。 输入
原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)
第一模块 第一模块采用的是一个单纯的卷积层紧跟一个最大池化层。
卷积层:卷积核大小77,步长为2,padding为3,输出通道数64,输出特征图尺寸为(224-7+32)/2+1=112.5(向下取整)=112,输出特征图维度为112x112x64,卷积后进行ReLU操作。
池化层:窗口大小3*3,步长为2,输出特征图尺寸为((112
-3)/2)+1=55.5(向上取整)=56,输出特征图维度为56x56x64。 关于卷积和池化中的特征图大小计算方式,可以参考我的博客神经网络之多维卷积的那些事
卷积层:
先用64个1x1的卷积核(3x3卷积核之前的降维)将输入的特征图(56x56x64)变为56x56x64,然后进行ReLU操作。参数量是116464=4096
再用卷积核大小33,步长为1,padding为1,输出通道数192,进行卷积运算,输出特征图尺寸为(56-3+12)/1+1=56,输出特征图维度为56x56x192,然后进行ReLU操作。参数量是3364192=110592
第二模块卷积运算总的参数量是110592+4096=114688,即114688/1024=112K。
池化层: 窗口大小3*3,步长为2,输出通道数192,输出为((56 - 3)/2)+1=27.5(向上取整)=28,输出特征图维度为28x28x192。
1、使用64个1x1的卷积核,运算后特征图输出为28x28x64,然后RuLU操作。参数量1119264=12288
2、96个1x1的卷积核(3x3卷积核之前的降维)运算后特征图输出为28x28x96,进行ReLU计算,再进行128个3x3的卷积,输出28x28x128。参数量1119296+3396128=129024
3、16个1x1的卷积核(5x5卷积核之前的降维)将特征图变成28x28x16,进行ReLU计算,再进行32个5x5的卷积,输出28x28x32。参数量1119216+551632=15872
4、pool层,使用3x3的核,输出28x28x192,然后进行32个1x1的卷积,输出28x28x32.。总参数量1119232=6144
将四个结果进行连接,对这四部分输出结果的第三维并联,即64+128+32+32=256,最终输出28x28x256。总的参数量是12288+129024+15872+6144=163328,即163328/1024=159.5K,约等于159K。
第三模块(Inception 3b层)
Inception 3b层,分为四个分支,采用不同尺度。
1、128个1x1的卷积核,然后RuLU,输出28x28x128
2、128个1x1的卷积核(3x3卷积核之前的降维)变成28x28x128,进行ReLU,再进行192个3x3的卷积,输出28x28x192
3、32个1x1的卷积核(5x5卷积核之前的降维)变成28x28x32,进行ReLU,再进行96个5x5的卷积,输出28x28x96
4、pool层,使用3x3的核,输出28x28x256,然后进行64个1x1的卷积,输出28x28x64
将四个结果进行连接,对这四部分输出结果的第三维并联,即128+192+96+64=480,最终输出输出为28x28x480。
第五模块(Inception 5a、5b)
与Inception3a,3b类似
输出层
前面已经多次提到,在输出层GoogLeNet与AlexNet、VGG采用3个连续的全连接层不同,GoogLeNet采用的是全局平均池化层,得到的是高和宽均为1的卷积层,然后添加丢弃概率为40%的Dropout,输出层激活函数采用的是softmax。
激活函数
GoogLeNet每层使用的激活函数为ReLU激活函数。
辅助分类器
根据实验数据,发现神经网络的中间层也具有很强的识别能力,为了利用中间层抽象的特征,在某些中间层中添加含有多层的分类器。如下图所示,红色边框内部代表添加的辅助分类器。GoogLeNet中共增加了两个辅助的softmax分支,作用有两点,一是为了避免梯度消失,用于向前传导梯度。反向传播时如果有一层求导为0,链式求导结果则为0。二是将中间某一层输出用作分类,起到模型融合作用。最后的loss=loss_2 + 0.3 * loss_1 + 0.3 * loss_0。实际测试时,这两个辅助softmax分支会被去掉。
上面介绍的GoogLeNet模型是Inception v1版本,还有Inception v2,v3,v4版本
从Inception到Xception,卷积方式的成长之路!_雷恩Layne的博客-CSDN博客
2014年Google提出了多尺度、更宽的Inception网络结构,不仅比同期的VGG更新小,而且速度更快。Xception则将Inception的思想发挥到了极致,解开了分组卷积和大规模应用的序幕。
本文将详细讲述
Inception v1的多尺度卷积和Pointwise Conv
Inception v2的小卷积核替代大卷积核方法
Inception v3的卷积核非对称拆分
Bottleneck卷积结构
Xception的Depthwise Separable Conv深度可分离卷积
Inception 最初提出的版本主要思想是利用不同大小的卷积核实现不同尺度的感知,网络结构图如下:
Inception Module基本组成结构有四个成分。11卷积,33卷积,55卷积,33最大池化。最后对四个成分运算结果进行通道上组合,这就是Inception Module的核心思想:利用不同大小的卷积核实现不同尺度的感知,最后进行融合,可以得到图像更好的表征。
使用了多尺度卷积后,我们的网络更宽了,同时也提高了对于不同尺度的适应程度。
使用了多尺度卷积后,我们的网络更宽了,虽然提高了对于不同尺度的适应程度,但是计算量也变大了,所以我们就要想办法减少参数量来减少计算量,于是在 Inception v1 中的最终版本加上了 1x1 卷积核,网络结构图如下:
图a与图b的区别就是是否使用了 1x1 卷积进行压缩降维
使用1x1 卷积核主要目的是进行压缩降维,减少参数量,这就是Pointwise Conv,简称PW。
举个例子,假如输入的维度是 96 维,要求输出的维度是 32 维,二种计算方式:
第一种:用3x3的卷积核计算,参数量是339632=27648(为了方便计算,这里忽略偏置bias,后面的计算均如此)
第二种:先用1x1卷积核将输出通道降维到32,参数量是119632=3072,再用3x3卷积计算输出,参数量是3332*32=9216,总的参数量是3072+9216=12288
从结果12288/27648=0.44可以看到,第二种方式的参数量是第一种方式的0.44倍,大大减少了参数量,加快训练速度。
由Inception Module组成的GoogLeNet(Inception V1):
Inception V1 的主要思想是利用不同大小的卷积核实现了不同尺度的感知,再加上1x1 卷积的大量运用,模型比较精简,比VGG更深但是却更小。
也有用Pointwise Conv做升维的,在 MobileNet v2 中就使用 Pointwise Conv 将 3 个特征图变成 6 个特征图,丰富输入数据的特征。
就算有了Pointwise Conv,由于 5x5 卷积核直接计算参数量还是非常大,训练时间还是比较长,于是Google学习VGGNet的特点,提出了使用多个小卷积核替代大卷积核的方法,这就是 Inception V2:
在Inception V2中,使用两个 3x3 卷积核来代替 5x5 卷积,不仅使参数量少了,深度也变深了,提升了神经网络的效果,可谓一举多得。
为什么提升了网络深度,可以提升神经网络效果?
因为多层非线性层(每一层都加了relu)可以提供更复杂的模式学习,而且参数量更少 => 采用堆积的小卷积核优于采用大卷积核(相同感受野的情况下)。
现在来计算一下参数量感受下吧!
假设输入 256 维,输出 512 维,计算参数量:
使用 5x5 卷积核,参数量为55256512=3276800
使用两个 3x3 卷积核,参数量为33256256+33256*512=1769472
从结果1769472/3276800=0.54可以看到,第二种方式的参数量是第一种方式0.54倍,大大的减少了参数量,加快训练速度。
在使用多个小卷积核替代大卷积核的方法后,参数量还是比较大,于是Google学习Factorization into small convolutions的思想,在Inception V2的基础上,将一个二维卷积拆分成两个较小卷积,例如将77卷积拆成17卷积和7*1卷积,这样做的好处是降低参数量。该paper中指出,通过这种非对称的卷积拆分比对称的拆分为几个相同的小卷积效果更好,可以处理更多,更丰富的空间特征。这就是Inception V3网络结构:
让我们计算下参数量感受下吧!
假设输入 256 维,输出 512 维,计算参数量:
使用 5x5 卷积核,参数量为55256512=3276800
先使用两个 1x5和5x1 卷积核,参数15256256+51256*512=983040
从结果983040/3276800=0.3可以看到,第二种方式的参数量是第一种方式0.3倍,比使用多个小卷积核替代大卷积核的方法减少还多。
Inception V4考虑到借鉴了微软的ResNet网络结构思想,等以后再做详细介绍。
我们发现使用上面的结构和方法,参数量还是较大,于是人们提出了 Bottleneck 的结构降低参数量。
Bottleneck结构分三步走,首先用Pointwise Conv进行降维,再用常规卷积核进行卷积,最后使用Pointwise Conv进行进行升维,如下所示:
来吧,又到了计算参数量的时刻!
假设输入 256 维,输出 512 维,计算参数量:
使用 3x3 卷积核,参数量为33256256=589824
使用 Bottleneck 的方式,先使用1x1卷积核将输入的256维讲到64维,再使用3x3卷积核进行卷积,最后用1x1卷积核将64升到256维,参数量为1125664+336464+1164256=69632
人们发现上面的方法参数量还是不少啊,于是又提出了Depthwise Separable Conv(深度可分离卷积),这就是大名鼎鼎的Xception的网络结构。
Depthwise Separable Conv的核心思想是首先经过1*1卷积,即Pointwise Convolution(逐点卷积),然后对每一个通道分别进行卷积,即Depthwise Conv(深度卷积),这就是Xception,即Extreme Inception。
我们来回顾一下从Inception到Xception的过程:
Inception v1的多尺度卷积利用不同大小的卷积核实现不同尺度的感知,可以得到图像更好的表征。
Inception v1的Pointwise Conv利用1x1卷积核进行压缩降维,减少参数量,使模型更加精简。
Inception v2使用多个小卷积核替代大卷积核的方法,不仅使参数量少了,深度也变深了,提升了神经网络的效果。
Inception v3的卷积核非对称拆分不仅可以降低参数量,而且可以处理更多,更丰富的空间特征。
Bottleneck卷积结构分三步走,参数量降得令人惊叹!
Xception的Depthwise Separable Conv首先经过PW,然后DW,再度减少参数量,使分组卷积这样的思想被广泛用于设计性能高效的网络。
基于Xception的网络结构MobileNets构建了轻量级的28层神经网络,成为了移动端上的高性能优秀基准模型;Resnet的残差连接直接skip connect,解决了深层网络的训练问题;可变形卷积 deformable convolution network 通过可变的感受野提升了CNN对具有不同几何形变物体识别能力的模型;DenseNet密集连接网络,把残差做到了极致,提高了特征的利用率;非局部神经网络转换一种思维,采用Non-Local连接,让神经网络具有更大的感受视野;多输入网络可以输入多张图片来完成一些任务;3D卷积虽然带来了暴涨的计算量,但是可以用于视频分类和分割;RNN和LSTM用于处理非固定长度或者大小的视频,语音等,更加适合用来处理这些时序信号;非生成对抗网络GAN已从刚开始的一个生成器一个判别器发展到了多个生成器多个判别器等各种各样的结构…