各种分类网络


几种网络的时间点

找到一个简单总结的文章,可以先看一下1

这是2

LeNet

本模块参加该blog,侵删
网络结构图
LeNet-5 这个网络虽然很小,但是它包含了深度学习的基本模块:卷积层,池化层,全连接层。

各层参数

1、Input层

	输入图像的尺寸统一归一化为32*32

2、C1卷积层

	输入图片:32*32
	卷积核大小:5*5
	卷积核种类:6		
	输出featuremap大小:28*28 (32-5+1)=28		
	神经元数量:28*28*6
	可训练参数:(5*5+1) * 6(每个滤波器5*5=25个unit参数和一个bias参数,一共6个滤波器)
	连接数:(5*5+1)*6*28*28=122304

3、S2池化层(下采样层)

	输入:28*28
	采样区域:2*2
	采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid
	采样种类:6
	输出featureMap大小:14*14(28/2)
	神经元数量:14*14*6
	可训练参数:2*6(和的权+偏置)
	连接数:(2*2+1)*6*14*14
	S2中每个特征图的大小是C1中特征图大小的1/4。

4、C3卷积层

	输入:S2中所有6个或者几个特征map组合
	卷积核大小:5*5
	卷积核种类:16
	输出featureMap大小:10*10 (14-5+1)=10
	C3中的每个特征map是连接到S2中的所有6个或者几个特征map的,表示本层的特征map是上一层提取到的特征map的不同组合。
	存在的一个方式是:C3的前6个特征图以S2中3个相邻的特征图子集为输入。接下来6个特征图以S2中4个相邻特征图子集为输入。然后的3个以不相邻的4个特征图子集为输入。最后一个将S2中所有特征图为输入。则:可训练参数:6*(3*5*5+1)+6*(4*5*5+1)+3*(4*5*5+1)+1*(6*5*5+1)=1516
	连接数:10*10*1516=151600

特征图每次采用的上层的的特征
为什么采用这样的组合?
1)减少参数,2)这种不对称的组合连接的方式有利于提取多种组合特征

5、S4池化层(下采样层)

	输入:10*10
	采样区域:2*2
	采样方式:4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid
	采样种类:16
	输出featureMap大小:5*5(10/2)
	神经元数量:5*5*16=400
	可训练参数:2*16=32(和的权+偏置)
	连接数:16*(2*2+1)*5*5=2000
	S4中每个特征图的大小是C3中特征图大小的1/4

6、C5卷积层

	输入:S4层的全部16个单元特征map(与s4全相连)
	卷积核大小:5*5
	卷积核种类:120
	输出featureMap大小:1*1(5-5+1)
	可训练参数/连接:120*(16*5*5+1)=48120

7、F6全连接层

	输入:c5 120维向量
	计算方式:计算输入向量和权重向量之间的点积,再加上一个偏置,结果通过sigmoid函数输出。
	可训练参数:84*(120+1)=10164

8、Output层-全连接层

   Output层也是全连接层,共有10个节点,分别代表数字0到9,且如果节点i的值为0,则网络识别的结果是数字i。采用的是径向基函数(RBF)的网络连接方式。假设x是上一层的输入,y是RBF的输出,则RBF输出的计算方式是:

在这里插入图片描述
上式w_ij 的值由i的比特图编码确定,i从0到9,j取值从0到7*12-1。RBF输出的值越接近于0,则越接近于i,即越接近于i的ASCII编码图,表示当前网络输入的识别结果是字符i。该层有84x10=840个参数和连接。

AlexNet

本模块参考该博客,侵删

网络亮点:

  1. 首次利用GPU进行加速
  2. 使用了Relu激活函数
  3. 使用了LRN局部响应归一化,增强了模型的泛化能力。
  4. 全连接层的前两层中使用了dropout随机失活,减小过拟合
  5. 在CNN中使用重叠的最大池化
    网络结构

Alexnet数据增强操作:

AlexNet中对数据做了以下操作:

  • 随机裁剪,对256×256的图片进行随机裁剪到227×227,然后进行水平翻转。
  • 测试的时候,对左上、右上、左下、右下、中间分别做了5次裁剪,然后翻转,共10个裁剪,之后对结果求平均。
  • 对RGB空间做PCA(主成分分析),然后对主成分做一个(0, 0.1)的高斯扰动,也就是对颜色、光照作变换,结果使错误率又下降了1%。

局部相应归一化

LRN一般是在激活、池化后进行的一中处理方法。
侧抑制(lateral inhibitio),即指被激活的神经元抑制相邻的神经元。归一化(normaliazation)的目的就是“抑制”,LRN就是借鉴这种侧抑制来实现局部抑制,尤其是我们使用RELU的时候,这种“侧抑制”很有效 ,因而在alexnet里使用有较好的效果。

  • 归一化有什么好处?
    1.归一化有助于快速收敛;
    2.对局部神经元的活动创建竞争机制,使得其中响应比较大的值变得相对更大,并抑制其他反馈较小的神经元,增强了模型的泛化能力。

网络参数:

输入是224×224,不过经过计算(224−11)/4=54.75并不是论文中的55×55,而使用227×227作为输入,则(227−11)/4=55。

  • 卷积层C1
    该层的处理流程是: 卷积–>ReLU–>池化–>归一化。

    • 卷积,输入是227×227,使用96个11×11×3的卷积核,得到的FeatureMap为55×55×96。
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中。
    • 池化,使用3×3步长为2的池化单元(重叠池化,步长小于池化单元的宽度),输出为27×27×96((55−3)/2+1=27)
    • 局部响应归一化,使用k=2,n=5,α=10−4,β=0.75进行局部归一化,输出的仍然为27×27×96,输出分为两组,每组的大小为27×27×48
  • 卷积层C2
    该层的处理流程是:卷积–>ReLU–>池化–>归一化

    • 卷积,输入是2组27×27×48。使用2组,每组128个尺寸为5×5×48的卷积核,并作了边缘填充+ padding=2,卷积的步长为1. 则输出的FeatureMap为2组,每组的大小为27×27 times128. ((27+2∗2−5)/1+1=27)
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
    • 池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为(27−3)/2+1=13,输出为13×13×256
    • 局部响应归一化,使用k=2,n=5,α=10−4,β=0.75进行局部归一化,输出的仍然为13×13×256,输出分为2组,每组的大小为13×13×128
  • 卷积层C3
    该层的处理流程是: 卷积–>ReLU

    • 卷积,输入是13×13×256,使用2组共384尺寸为3×3×256的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13 times384
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
  • 卷积层C4
    该层的处理流程是: 卷积–>ReLU 该层和C3类似。

    • 卷积,输入是13×13×384,分为两组,每组为13×13×192.使用2组,每组192个尺寸为3×3×192的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13 times384,分为两组,每组为13×13×192
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
  • 卷积层C5
    该层处理流程为:卷积–>ReLU–>池化

    • 卷积,输入为13×13×384,分为两组,每组为13×13×192。使用2组,每组为128尺寸为3×3×192的卷积核,做了边缘填充padding=1,卷积的步长为1.则输出的FeatureMap为13×13×256
    • ReLU,将卷积层输出的FeatureMap输入到ReLU函数中
      池化,池化运算的尺寸为3×3,步长为2,池化后图像的尺寸为 (13−3)/2+1=6,即池化后的输出为6×6×256
  • 全连接层FC6
    该层的流程为:(卷积)全连接 -->ReLU -->Dropout

    • 卷积->全连接: 输入为6×6×256,该层有4096个卷积核,每个卷积核的大小为6×6×256。由于卷积核的尺寸刚好与待处理特征图(输入)的尺寸相同,即卷积核中的每个系数只与特征图(输入)尺寸的一个像素值相乘,一一对应,因此,该层被称为全连接层。由于卷积核与特征图的尺寸相同,卷积运算后只有一个值,因此,卷积后的像素层尺寸为4096×1×1,即有4096个神经元。
    • ReLU,这4096个运算结果通过ReLU激活函数生成4096个值
    • Dropout,抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元
  • 全连接层FC7
    流程为:全连接–>ReLU–>Dropout
    全连接,输入为4096的向量

    • ReLU,这4096个运算结果通过ReLU激活函数生成4096个值
    • Dropout,抑制过拟合,随机的断开某些神经元的连接或者是不激活某些神经元
  • 输出层
    第七层输出的4096个数据与第八层的1000个神经元进行全连接,经过训练后输出1000个float型的值,这就是预测结果。

VGG

该模块参考于此,侵删
"Very Deep Convolutional Networks for Large-Scale Image Recognition"从文章题目能看出来特点:
通过堆叠多个3*3的卷积核来代替大尺度卷积核,减小所需参数。

  • 2个3*3 = 5*5
  • 3个3*3 = 7*7
    拥有相同的感受野,减少参数,增加深度

网络结构

VGG网络结构
作者多了很多尝试,但是常用的是D结构。

特点

  • VGG16包含了16个隐藏层(13个卷积层和3个全连接层)
  • VGG19包含了19个隐藏层(16个卷积层和3个全连接层)
  • VGG网络的结构非常一致,从头到尾全部使用的是3x3的卷积和2x2的max pooling
    • conv的stride是1,padding为1,不改变特征矩阵尺寸
    • maxpooling的size为2,stride为2,使高度变为一半
  • 缺点:参数多,全连接层参数很多,而且又有三个全连接层

Resnet

我们发现过深的网络仍然还会使分类准确度下降。
所以不是网络越深效果越好,有两个问题:

  1. 梯度消失或梯度爆炸
    • 小梯度或者大梯度的连乘导致梯度消失
    • 解决办法:
      • 对数据标准化处理
      • 权重初始化
      • BN
  2. 退化问题
    • 残差网络

网络中亮点:

  • 超深的网络结构,突破1000层
  • 提出residual模块
  • 使用BN加速训练,丢弃dropout

residual结构:
在这里插入图片描述
注意:

  1. 其是在相同的维度进行相加,主分支与shortcut的输出矩阵的shape必须相同
  2. 1*1的卷积核用来升维和降维,因为更深层使用bottleneck

网络结构图:
在这里插入图片描述
细节:

  1. 每个残差块有两个3*3卷积核
  2. 周期性2倍增卷积核组数和2倍下采样减尺寸
  3. 网络初始有单独的卷积层
  4. 只有一个全连接层

GoogLeNet–InceptionV1

22层,500万参数,仅为Alexnet 1/12, VGGNet参数又是AlexNet的3倍

亮点

  • 引入Inception结构,融合不同尺度的特征信息。
  • 使用1*1卷积核进行降维以及映射处理
  • 添加两个辅助分类器帮助训练
  • 丢弃全连接层,使用平均池化层(大大减少了参数)

1*1conv的作用

在Network in network中提出:

  1. 降维或升维
  2. 跨通道的信息交融
  3. 减少参数量
  4. 增加模型深度,提高非线性表示能力

Inception结构

Naive version

  • 卷积池化后的尺寸相同,在通道层面上进行连接,但是通道数会增大
  • 增加了网络宽度
  • 增加了多维度信息,增加了对网络适应性
  • 在这些层之上,在每一个卷积层后都要做一个ReLU操作
    Inception module with dimension reductions
  • 在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用
  • 减少参数量,减少计算量,减少通道数
  • 每个分支得到的矩阵的高和宽必须相同

网络结构

具体大图结构看别人博客

网络结构解析

  • 原始输入图像为224x224x3,且都进行了零均值化的预处理操作(图像每个像素减去均值)。
  • Conv后接Relu,Maxpooling后接Relu

亮点

  • Inception结构
  • 网络最后采用了average pooling(平均池化)来代替全连接层,该想法来自NIN(Network in Network),实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整
  • 但是网络中依然使用了Dropout
  • 额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器)(4a,4d),辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合.
  • 而在实际测试的时候,这两个额外的softmax会被去掉。
  • 浅层的辅助分类器后面被证实没有太大作用,作者在InceptionV2/V3的论文里去掉了浅层分类器
  • Global Average Pooling便于迁移学习。

InceptionV2

该模块参考此链接,侵删

如何在不增加过多计算量的同时提高网络的表达能力就成为了一个问题。
Inception V2版本的解决方案就是修改Inception的内部计算逻辑,提出了比较特殊的“卷积”计算结构。

1、卷积分解(Factorizing Convolutions)

  1. GoogLeNet团队提出可以用2个连续的3x3卷积层组成的小网络来代替单个的5x5卷积层,即在保持感受野范围的同时又减少了参数量。那么这种替代方案会造成表达能力的下降吗?通过大量实验表明,并不会造成表达缺失

  2. 大卷积核完全可以由一系列的3x3卷积核来替代,那能不能再分解得更小一点呢?GoogLeNet团队考虑了nx1的卷积核

  3. 因此,任意nxn的卷积都可以通过1xn卷积后接nx1卷积来替代。GoogLeNet团队发现在网络的前期使用这种分解效果并不好,在中度大小的特征图(feature map)上使用效果才会更好(特征图大小建议在12到20之间)。

具体流程如图所示:
发展过程
总结一下,怎么减小参数量,增加计算效率:

  1. 大卷积核,换成多层堆叠的小卷积核。
  2. 1*1卷积用来降维或升维
  3. N*N换成1X N和NX1

以上所有操作:更少参数量、计算量,更多的非线性变换

2、降低特征图大小

一般情况下,如果想让图像缩小,可以有如下两种方式:
在这里插入图片描述
先池化再作Inception卷积,或者先作Inception卷积再作池化。但是方法一(左图)先作pooling(池化)会导致特征表示遇到瓶颈(特征缺失),方法二(右图)是正常的缩小,但计算量很大。为了同时保持特征表示且降低计算量,将网络结构改为下图,使用两个并行化的模块来降低计算量(卷积、池化并行执行,再进行合并)
在这里插入图片描述
网络结构图:
上表中的Figure 5指没有进化的Inception,Figure 6是指小卷积版的Inception(用3x3卷积核代替5x5卷积核),Figure 7是指不对称版的Inception(用1xn、nx1卷积核代替nxn卷积核)。

labelsmoothing

在Inception v2中被提出,是一种正则化的策略。

  • one-hot:正确类别对应的分数Logit会一味增大,直到正无穷,
    • 过拟合,模型死记硬背无法泛化
    • 鼓励模型死记硬背,不计一切增加某一类的logit
  • labelsmoothing:正确答案对应的分数上界不会再增加到正无穷了。

其通过"软化"传统的one-hot类型标签,使得在计算损失值时能够有效抑制过拟合现象。label smoothing相当于减少真实样本标签的类别在计算损失函数时的权重,最终起到抑制过拟合的效果。

label smoothing将真实概率分布作如下改变:

在这里插入图片描述
与之对应,label smoothing将交叉熵损失函数作如下改变:
在这里插入图片描述

BN-Inception

亮点:

  1. 加入BN层,增加了模型的鲁棒性,可以以更大的学习率学习,收敛更快,初始操作更随意,同时作为一种正则化技术,可以减少dropout层使用。
  2. 2个3X3代替5X5
  3. LRN是不必要的
  4. 加大learning rate decay
  5. 对数据更加彻底的shuffle
  6. 减少了数据的图像变形

如果要对输入做白化,那么梯度下降时就要计算每个输入特征之间的协方差,这个运算量非常大,因此作者提出BN再做归一化时仅在每个特征维度上做,而不是计算所有特征共同的特征。

V1到BN的改动

  1. 2个 3X3 代替 5X5 。
  2. 28*28 modules从2个增加到3个。
  3. 在modules中,pooling有时average ,有时maximum 。
  4. 没有across board pooling layers在任意两个inception modules。只在3c,4e里会有stride-2的卷积和pooling。

网络结构图:

在这里插入图片描述

InceptionV3

作者注意到辅助分类器直到训练过程快结束时才有较多贡献,那时准确率接近饱和。作者认为辅助分类器的功能是正则化,尤其是它们具备 BatchNorm 或 Dropout 操作时。是否能够改进 Inception v2 而无需大幅更改模块仍需要调查。

解决方案:
Inception Net v3 整合了前面 Inception v2 中提到的所有升级,还使用了:

  1. RMSProp 优化器;
  2. Factorized 7x7 卷积;
  3. 辅助分类器使用了 BatchNorm;
  4. 标签平滑(添加到损失公式的一种正则化项,旨在阻止网络对某一类别过分自信,即阻止过拟合)。
  5. Inception V3一个最重要的改进是分解(Factorization),将7x7分解成两个一维的卷积(1x7,7x1),3x3也是一样(1x3,3x1),这样的好处,既可以加速计算,又可以将1个卷积拆成2个卷积,使得网络深度进一步增加,增加了网络的非线性(每增加一层都要进行ReLU)。
  6. 另外,网络输入从224x224变为了299x299。

InceptionV4

本模块参考此文章,侵删

Inception V4研究了Inception模块与残差连接的结合。
Inception V4主要利用残差连接(Residual Connection)来改进V3结构,得到Inception-ResNet-v1,Inception-ResNet-v2,Inception-v4网络。

准确率:

  • Inception-ResNet-v1 约等于 InceptionV3
  • Inception-ResNet-v2 约等于 InceptionV4

作者认为不用残差连接也可以训练很深的网络,但残差连接能显著加快训练。

亮点如下:

  1. 将Inception模块和ResidualConnection结合,提出了Inception-ResNet-v1,Inception-ResNet-v2,使得训练加速收敛更快,精度更高。
  2. 设计了更深的Inception-v4版本,效果和Inception-ResNet-v2相当。
  3. 网络输入大小和V3一样,还是299*299

inceptionV4

在inception网络设计中,最开始的几层总是不建议使用inception等模块来节省计算以抽取信息的,因此它们多是只采用简单的conv层或者相对简单的inception模块。
输入模块
下面为inception v4之上的各个不同大小的feature map grid所使用的inception模块及它们之间的连接。细看就会发现它的设计也主要遵循之前在inception v3中所使用的原则,只是更复杂了些。
应用于Inception_v4的inception模块及其之间的连接
最终的Inception v4网络

在这里插入图片描述

Inception-Resnet

在inception-resnet中所用的inception-resnet模块里都在inception子网络的最后加入了一个1x1扩展conv 操作用于使得它的输出宽度(channels数目)与子网络的输入宽度相同,从而方便相加。

inception-resnet v1

主要被用来与inception v3模型性能进行比较。
inception-resnet modules和inception-resnet A/inception-resnet B及inception-resnet B与inception-resnet C之间的连接
inception-resnet C模块:

Inception-Resnet_v1所用的C模块
最后下面为inception-resnet v1的网络输入模块,注意它与inception v4和inception-resnet v2的并不相同。
在这里插入图片描述

inception-resnet v2

下面为inception-resnet v2所使用的各个主要模块。
在这里插入图片描述
下面为inception-resnet v1/v2网络的整体结构:
在这里插入图片描述

residual模块的scaling

作者们实验发现如果对inception-resnet网络中的residual模块的输出进行scaling(如以0.1-0.3),那么可以让它的整个训练过程更加地稳定。如下图为scaling的具体做法示意。

  • 卷积核个数超过1000个时残差块会很不稳定,在训练早期,最后Avg、pool层之前的feature map里有很多0。
  • 使用更小的学习率和BN都不能解决这个问题,
  • 解决方法:在加法融合之前对残差分支的结果乘以幅度缩小系数,幅度缩小不是必须的,但它并不会损伤准确率,且会让训练更稳定。
    在这里插入图片描述

EfficientNet

本模块参考该文章,侵删

在这里插入图片描述

作者重新审视了前人提出的模型放缩的几个维度:网络深度、网络宽度、图像分辨率

  • 网络深度Depth:层的个数
  • 网络宽度Width:每个层的通道数,卷积核个数
  • 图像分辨率Res:输入图片大小,尺寸越大,输入信息越多

卷积神经网络可以看做一个映射,从输入到最后的输出。具体分析看上边模块连接。
那个在卷积层,即卷积函数不考虑的情况下,即固定网络结构,只变动上面提到的三个放缩维度,网络深度(Li),网络宽度(Ci),输入分辨率大小(Hi, Wi)。F_i(L_i)表示第 i 个 stage ,它由卷积层 F_i 重复 L_i 次构成,<H_i, W_i, C_i> 表示该 stage 输入 tensor 的维度。

作者接着做实验得出来:三个维度中任一维度的放大都可以带来精度的提升,但随着倍率越来越大,提升却越来越小。

有了上边的结果,作者接着做实验得出:作者又得到一个观点,得到更高的精度以及效率的关键是平衡网络宽度,网络深度,图像分辨率三个维度的放缩倍率(d, r, w)。

直观的理解:如果图片大的话(Res),就需要增加层(Depth)去增加感受野,并且需要增加通道(Width)去捕捉更加细粒度的特征;宽度(Width)很长但深度(Depth)很浅的网络往往不能提取到图片的高层语义信息。

作者提出了一种混合维度放大法(compound scaling method),该方法使用一个混合系数来决定三个维度的放大倍率
在这里插入图片描述
α \alpha α, β \beta β, γ \gamma γ 均为常数(不是无限大的因为三者对应了计算量),可通过网格搜索获得。混合系数 ϕ \phi ϕ可以人工调节。即卷积操作的计算量(FLOPS) 与 d,w2,r2 成正比,在该约束条件下,指定混合系数 ϕ \phi ϕ之后,网络的计算量大概会是之前的 2^ ϕ \phi ϕ倍。

网络结构

该网络的核心结构为移动翻转瓶颈卷积(mobile inverted bottleneck convolution,MBConv)模块,该模块还引入了压缩与激发网络(Squeeze-and-Excitation Network,SENet)的注意力思想

移动翻转瓶颈卷积
也是通过神经网络架构搜索得到的,该模块结构与深度分离卷积(depthwise separable convolution)相似,该移动翻转瓶颈卷积首先对输入进行1x1的逐点卷积并根据扩展比例(expand ratio)改变输出通道维度(如扩展比例为3时,会将通道维度提升3倍。但如果扩展比例为1,则直接省略该1x1的逐点卷积和其之后批归一化和激活函数)。接着进行kxk的深度卷积(depthwise convolution)。如果要引入压缩与激发操作,该操作会在深度卷积后进行。再以1x1的逐点卷积结尾恢复原通道维度。最后进行连接失活(drop connect)和输入的跳越连接(skip connection)

注意:

  • 在EfficientNets中,只有当相同的移动翻转瓶颈卷积重复出现时,才会进行连接失活和输入的跳越连接,且还会将其中的深度卷积步长变为1
  • 该模块中的每一个卷积操作后都会进行批归一化
  • 激活函数使用的是Swish激活函数。

移动翻转瓶颈卷积模块中的压缩与激发操作,以下简称SE模块,
是一种基于注意力的特征图操作操作,SE模块首先对特征图进行压缩操作,在通道维度方向上进行全局平均池化操作(global average pooling),得到特征图通道维度方向的全局特征。然后对全局特征进行激发操作,使用激活比例(R,该比例为浮点数)乘全局特征维数(C)个1x1的卷积对其进行卷积(原方法使用全连接层),学习各个通道间的关系,再通过sigmoid激活函数得到不同通道的权重,最后乘以原来的特征图得到最终特征。本质上,SE模块是在通道维度上做(注意力)attention或者(门控制)gating操作,这种注意力机制让模型可以更加关注信息量最大的通道特征,而抑制那些不重要的通道特征。另外一点是SE模块是通用的,这意味着其可以嵌入到现有的其它网络架构中。
SE
注意

  • 在移动翻转瓶颈卷积模块中,与激活比例相乘的是移动翻转瓶颈卷积模块的输入通道维度,而不是模块中深度卷积后的输出通道维度。

系列所有网络模型架构:
所有8个模型的开始和结尾
在这里插入图片描述
之后,每个主干包含7个block。这些block还有不同数量的子block,这些子block的数量随着EfficientNetB0到EfficientNetB7而增加。
在这里插入图片描述
我们使用这5个模块来构建整个结构。

  • 模块1 — 这是子block的起点。
  • 模块2 — 此模块用于除第一个模块外的所有7个主要模块的第一个子block的起点。
  • 模块3 — 它作为跳跃连接到所有的子block。
  • 模块4 — 用于将跳跃连接合并到第一个子block中。
  • 模块5 — 每个子block都以跳跃连接的方式连接到之前的子block,并使用此模块进行组合。

这些模块被进一步组合成子block,这些子block将在block中以某种方式使用:
在这里插入图片描述

  • 子block1 — 它仅用于第一个block中的第一个子block。
  • 子block2 — 它用作所有其他block中的第一个子block。
  • 子block3 — 用于所有block中除第一个外的任何子block。

EfficientNet-B0:
在这里插入图片描述
EfficientNet-B1:
在这里插入图片描述
EfficientNet-B2:
它的架构与上面的模型相同,唯一的区别是特征图(通道)的数量不同,增加了参数的数量。

········

具体介绍参考该链接,侵删

基于MobileNetV2 + SE Module的NAS搜索。
网络结构作者主要借鉴了 MnasNet,采取了同时优化精度(ACC)以及计算量(FLOPS)的方法,由此产生了初代 EfficientNet-B0,其结构如下图:
在这里插入图片描述
EfficientNet-B0的结构,它由16个移动翻转瓶颈卷积模块,2个卷积层,1个全局平均池化层和1个分类层构成。图中不同的颜色代表了不同的阶段。
完整结构图
以上网络具体步骤分析看以下链接,侵删

有了初代的网络结构之后,放大就分为下面两步:

  • 第一步,首先固定 ϕ \phi ϕ为 1,即设定计算量为原来的 2 倍,在这样一个小模型上做网格搜索(grid search),得到了最佳系数为 α \alpha α =1.2, β \beta β=1.1, γ \gamma γ=1.15 。
  • 第二步,固定 α \alpha α =1.2, β \beta β=1.1, γ \gamma γ=1.15,使用不同的混合系数 ϕ \phi ϕ来放大初代网络得到 EfficientNet-B1 ~ EfficientNet-B7。
widthdepthresdropout
EfficientNetb01.01.02240.2
EfficientNetb11.01.12400.2
EfficientNetb21.11.22600.3
EfficientNetb31.21.43000.3
EfficientNetb41.41.83800.4
EfficientNetb51.62.24560.4
EfficientNetb61.82.65280.5
EfficientNetb72.03.16000.5

该链接存了没看,应该挺好的 可以看一下

SPP-NET

该模块参考此文章,侵删

  • 问题1:形变耗时又损失信息,为什么要形变
    很简单,因为CNN的输入必须是固定尺寸。

  • 问题2:为什么CNN的输入必须固定尺寸
    CNN主要由两部分组成,卷积层和全连接层,卷积层可以接受任意尺寸的图像,只是不同的输入卷积后的特征图尺寸不同,而全连接必须是固定的输入,所以任意尺寸生成了不同的特征图,不符合全连接的输入,由此我们发现,CNN固定输入的需求完全来自于全连接层。

既然只有全连接需要固定输入,那么能否在全连接前面加上一个网络层,使得卷积的不同输出被转化成固定尺寸呢?空间金字塔池化(spatial pyramid pooling,SPP)层来解决这个问题。

SPP层放在最后一个卷积层后面,对特征图进行池化操作,并产生固定长度的输出,喂给全连接层。

优点:
这种方法不仅解决了形变的问题,还有一个有意思的说法,就是通过裁剪或者缩放的形变使得信息在一开始就被暴力的删减,可能损失有用信息,而SPP是在卷积之后,对信息的一种汇总,放弃无效信息,这有助于提高模型的精度,作者也通过实验证明了这个观点。

具体操作如图:
在这里插入图片描述

  • 黑色代表特征映射图
  • 把不同尺寸的特征映射图分为1份、4份、16份,然后在每个块上进行最大池化,池化后的特征拼接到一起,形成固定输出
  • 由此我们发现分成几块 pool nn,跟我们的池化野没有关系,池化野可以是任意的合理尺寸,只要最终能生成 nn 块就行了。

SPPNet 的训练

因为深度学习框架是需要固定输入的:我的理解,每次喂给网络batch个样本,如果样本尺寸不一样,那怎么卷积呢?ok,如果你说一张一张卷积,也可以,但是这样卷积后的尺寸不同,要分开存储,而且,GPU是并行计算的,属于矩阵间的计算,尺寸不同,根本无法存储在一个矩阵里,何谈并行,所以肯定要固定输入。

作者将网络的训练分为两种:Single-size 和 Multi-size。

具体细节看这篇吧,没看懂其实

ZFNet

可视化并理解卷积神经网络

FNet(2013)在AlexNet(2012)的基础上,性能再次提升。

网络架构;
在这里插入图片描述
ZFNet的网络架构是在AlexNet基础上修改而来,与AlexNet相比,差异不大:

  • 第1个卷积层,kernel size从11减小为7,将stride从4减小为2(这将导致feature map增大1倍)
  • 为了让后续feature map的尺寸保持一致,第2个卷积层的stride从1变为2
  • 和AlexNet基本一致。权重初始化不同,权重初始化为0.01,bias初始化为0。
  • 通过可视化发现第一层的卷积核影响大,于是对第一层的卷积核做了规范化,如果RMS(Root Mean Square)超过0.1,就把卷积核的均方根normalize为固定0.1。

特征可视化

该模块参考,侵删

与提出一个性能更好的网络结构相比,这篇论文更大的贡献在于提出一种将卷积神经网络深层特征可视化的方法。

卷积神经网络通过逐层卷积将原始像素空间逐层映射到特征空间,深层feature map上每个位置的值都代表与某种模式的相似程度,但因为其位于特征空间,不利于人眼直接观察对应的模式,为了便于观察理解,需要将其映射回像素空间

可视化操作,针对的是已经训练好的网络,或者训练过程中的网络快照,可视化操作不会改变网络的权重,只是用于分析和理解在给定输入图像时网络观察到了什么样的特征,以及训练过程中特征发生了什么变化。

可视化操作的步骤如图所示:
在这里插入图片描述

可视化时每一层的操作如下:

  • Unpooling:在前向传播时,记录相应max pooling层每个最大值来自的位置,在unpooling时,根据来自上层的map直接填在相应位置上,如上图所示,Max Locations “Switches”是一个与pooling层输入等大小的二值map,标记了每个局部极值的位置。
  • Rectification:因为使用的ReLU激活函数,前向传播时只将正值原封不动输出,负值置0,“反激活”过程与激活过程没什么分别,直接将来自上层的map通过ReLU。
  • Deconvolution:可能称为transposed convolution更合适,卷积操作output map的尺寸一般小于等于input map的尺寸,transposed convolution可以将尺寸恢复到与输入相同,相当于上采样过程,该操作的做法是,与convolution共享同样的卷积核,但需要将其左右上下翻转(即中心对称),然后作用在来自上层的feature map进行卷积,结果继续向下传递。

上采样

上采样有三种形式:双线性插值,反卷积,反池化

  1. 双线性内插法
    双线性内插法是利用待求象素四个邻象素的灰度在两个方向上作线性内插,其核心思想是在两个方向分别进行一次线性插值。如下图所示:
    在这里插入图片描述
  2. 转置卷积–反卷积
  • 在上面的双线性插值方法中不需要学习任何参数。而转置卷积就像卷积一样需要学习参数。
  • 并不是正向卷积的完全逆过程,是一种特殊的正向卷积,按照一定比例补0扩大输入图像尺寸,接着旋转卷积核,在进行正向卷积。
  • 反卷积只能回复尺寸,不能恢复数值。
  • 而且当stride>=2 时,即使用完全相同的参数进行转置卷积,输入尺寸也不能恢复。
  • 反卷积可将中间层feature map重构回原始输入像素空间,可视化。
    在这里插入图片描述
    更多关于反卷积参考这个

反卷积也称为转置卷积,如果用矩阵乘法实现卷积操作,将卷积核平铺为矩阵,则转置卷积在正向计算时左乘这个矩阵的转置WT,在反向传播时左乘W,与卷积操作刚好相反,需要注意的是,反卷积不是卷积的逆运算。

一般的卷积运算可以看成是一个其中非零元素为权重的稀疏矩阵C与输入的图像进行矩阵相乘,反向传播时的运算实质为C的转置与loss对输出y的导数矩阵的矩阵相乘。

逆卷积的运算过程与卷积正好相反,是正向传播时做成C的转置,反向传播时左乘C

  1. 反池化
    unsampling和unpooling可以通过一个图来简单理解:
    在这里插入图片描述

在这里插入图片描述

严格意义上的反池化是无法实现的。作者采用近似的实现,在训练过程中记录每一个池化操作的一个z*z的区域内输入的最大值的位置,这样在反池化的时候,就将最大值返回到其应该在的位置,其他位置的值补0。

论文做了什么

  1. 训练过程中不同层特征可视化:
    通过对各层卷积核学习到的特征进行可视化发现神经网络学习到的特征存在层级结构。

    可视化的步骤

    1. 把输入图像给网络,正向计算,计算出中间层的feature map
    2. 除指定某层的某个feature map不为0,其他均设为0,然后把这个feature map反向传回输入像素空间。
    3. 反池化,反激活,反卷积

    整个过程:输入图片–卷积–Relu–最大池化–得到特征结果图–反池化–Relu–反卷积

  2. 特征演化

    • 特征收敛:底层快,高层慢。低层特征经过较少epoch的训练过程之后就学习的比较稳定了,层数越高越需要更多的epoch进行训练。因此需要足够多的epoch过程来保证顺利的模型收敛。
    • 网络越深越关注语义信息,网络浅关注空间信息。
  3. 平移、缩放、旋转敏感性分析:
    卷积神经网络具有平移和缩放不变性,并且层数越高不变性越强。但是不具有旋转不变性。

    • 变换对底层影响显著,对高层影响小
    • 网络对平移缩放不敏感
    • 对旋转敏感,除非旋转到对称位置
  4. 模型改进

    • 第1个卷积层,kernel size从11减小为7,将stride从4减小为2(这将导致feature map增大1倍)。因为步长太大导致网格特征,无用。11*11导致高频信息,有些神经元失效。
    • 为了让后续feature map的尺寸保持一致,第2个卷积层的stride从1变为2。
  5. 局部遮挡敏感性能分析:
    遮挡实验说明图像的关键区域被遮挡之后对分类性能有很大的影响,说明分类过程中模型明确定位出了场景中的物体。在识别一个物体时,起重要判别依据的是物体本身而非背景环境等不相干的信息。

  6. 相关性遮挡分析:
    做了图片的部分遮挡探究物体部件之间的关系,发现了深度网络非显式地计算了这些关系。
    不同图像的指定目标局部块之间是否存在一致性的关联,作者认为深度模型可能默认学习到了这种关联关系。不同图像的指定目标局部块之间是否存在一致性的关联,作者认为深度模型可能默认学习到了这种关联关系。作者通过对五张不同的狗的图像进行局部遮挡,然后分析原图和遮挡后的图像的特征之间的汉明距离的和值,值越小说明一致性越大。实验表明,对不同的狗的图像遮挡左眼、右眼和鼻子之后的汉明距离小于随机遮挡,证明存在一定的关联性。

  7. 模型迁移泛化能力:
    之后仅用少数图片重新训练softmax层,在不同数据集上将imagenet训练所得的卷积网络当做特征提取器。都表现良好,有种迁移学习的感觉。

  8. 全连接层和卷积层去除后的性能分析:

    • 改变全连接层的节点个数对分类性能影响不大
    • 改变中间卷积层的节点数对训练结果有帮助,但是加大了过拟合的可能。
  9. 各层特征有效性分析。较高层通常产生更多的区分性特征

总结

  1. 在扩充训练集的时候,调整图像角度是关键,不需要过多的将图像切割成多片进行训练
  2. 仔细考虑,每个层对奇特层的影响,特别是全连接层
  3. 可先进行其他数据集的预训练

DenseNet

本模块参考该链接,侵删—可直接转过去看这个博客,超级详细

  • DenseNet模型,它的基本思路与ResNet一致,但是它建立的是前面所有层与后面层的密集连接(dense connection),它的名称也是由此而来。
  • 另一大特色是通过特征在channel上的连接来实现特征重用(feature reuse)。这些特点让DenseNet在参数和计算成本更少的情形下实现比ResNet更优的性能
  • 那就是在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来!
  • 简单讲,就是每一层的输入来自前面所有层的输出。

dense block图:

在这里插入图片描述
先列下DenseNet的几个优点,感受下它的强大:

  1. 减轻了vanishing-gradient(梯度消失)
  2. 加强了feature的传递
  3. 更有效地利用了feature
  4. 一定程度上较少了参数数量
  5. 网络更窄,参数更少,很大一部分原因得益于这种dense block的设计,后面有提到在dense block中每个卷积层的输出feature map的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。
  6. dense connection有正则化的效果,因此对于过拟合有一定的抑制作用
  7. 由于特征复用,最后分类器使用了低级特征。

ResNet:
l表示层,xl表示l层的输出,Hl表示一个非线性变换
DenseNet:
[x0,x1,…,xl-1]表示将0到l-1层的输出feature map做concatenation,Hl包括BN,ReLU和3*3的卷积。
DenseNet的结构图:
在这里插入图片描述

作者将DenseNet分成多个dense block,原因是希望各个dense block内的feature map的size统一,这样在做concatenation就不会有size的问题。

参数图:
在这里插入图片描述

  • k是growth rate,作者的实验也表明小的k可以有更好的效果
  • dense block的33卷积前面都包含了一个11的卷积操作,就是所谓的bottleneck layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征。
  • DenseNet-B:Bn+Relu+1X1conv+BN+Relu+3X3conv
  • 如果你看到DenseNet-C这个网络,表示增加了这个Translation layer,该层的1*1卷积的输出channel默认是输入channel到一半。
  • Transition:Bn+Relu+1X1conv+2X2avgpooling
  • 另外Transition起到压缩模型的作用。压缩系数(0,1].
  • 如果你看到DenseNet-BC这个网络,表示既有bottleneck layer,又有Translation layer。

NasNet

参考自该文章,侵删—讲的比较详细,我这是阉割版,看不懂的话直接转

作者将用于ImageNet的NAS简称为NASNet。
在NASNet中,完整的网络的结构还是需要手动设计的,NASNet学习的是完整网络中被堆叠、被重复使用的网络单元。

两种类型的网络块:

  • Normal Cell:输出Feature Map和输入Feature Map的尺寸相同;
  • Reduction Cell:降采样,对使用Input Feature作为输入的操作(卷积或者池化)会默认步长为2。

控制器结构图:
在这里插入图片描述
每个网络单元由 B的网络块(block)组成,在实验中 B=5 。

更精确的讲,NASNet网络单元的计算分为5步:

  • 从第 hi-1个Feature Map或者第 hi 个Feature Map或者之前已经生成的网络块中选择一个Feature Map作为hidden layer A的输入
  • 采用和1类似的方法为Hidden Layer B选择一个输入;
  • 为1的Feature Map选择一个运算;
  • 为2的Feature Map选择一个元素;
  • 选择一个合并3,4得到的Feature Map的运算。

其中:
在这里插入图片描述

Scheduled Drop Path

在优化类似于Inception的多分支结构时,以一定概率随机丢弃掉部分分支是避免过拟合的一种非常有效的策略,例如DropPath。但是DropPath对NASNet不是非常有效。在NASNet的Scheduled Drop Path中,丢弃的概率会随着训练时间的增加线性增加。这么做的动机很好理解:训练的次数越多,模型越容易过拟合,DropPath的避免过拟合的作用才能发挥的越有效。

总结

  • NASNet最大的贡献是解决了NAS无法应用到大数据集上的问题,它使用的策略是先在小数据集上学一个网络单元,然后在大数据集上堆叠更多的单元的形式来完成模型迁移的。
  • NASNet已经不再是一个dataset interest的网络了,因为其中大量的参数都是人为设定的,网络的搜索空间更倾向于密集连接的方式。这种人为设定参数的一个正面影响就是减小了强化学习的搜索空间,从而提高运算速度
  • NASNet的网络单元本质上是一个更复杂的Inception,可以通过堆叠 网络单元的形式将其迁移到任意分类任务,乃至任意类型的任务中。因此搜索网络时,只搜索最优block。
  • 比较完整的一个文章,没仔细看,可以看一下

Block结构

NasNet-A
NASNet-B(包含4个输入和4个输出)
NASNet-C

ResNeXt

该模块参考此文章,侵删

  • ResNeXt是ResNet和Inception的结合体
  • 但是 Inception 系列网络有个问题:网络的超参数设定的针对性比较强,当应用在别的数据集上时需要修改许多参数,因此可扩展性一般。
  • 不同于Inception v4的是,ResNext不需要人工设计复杂的Inception结构细节,而是每一个分支都采用相同的拓扑结构。
  • cardinality:the size of the set of transformations
  • 每个被聚合的拓扑结构都是一样的(这也是和 Inception 的差别,减轻设计负担)
  • ResNeXt的本质是分组卷积(Group Convolution),通过变量基数(Cardinality)来控制组的数量。组卷机是普通卷积和深度可分离卷积的一个折中方案,即每个分支产生的Feature Map的通道数为N(N>1)。

“split-transform-merge”结构

  1. Split:将数据X split成 D个特征;
  2. Transform:每个特征经过一个线性变换;
  3. Merge:通过单位加合成最后的输出。
  4. 是通用的神经网络的标准范式
  5. 4相当于说:Inception、resnet、通道分组卷积网络,都只是ResNeXt这一范式的特殊形式而已,进一步说明了该结构的普通性和有效性,以及抽象程度更高,更本质一点。

Inception是一个非常明显的“split-transform-merge”结构,作者认为Inception不同分支的不同拓扑结构的特征有非常刻意的人工雕琢的痕迹,而往往调整Inception的内部结构对应着大量的超参数,这些超参数调整起来是非常困难的。

所以作者的思想是每个结构使用相同的拓扑结构

ResNeXt和Inception v4是非常像的。不同之处有两点:

  • ResNeXt的分支的拓扑结构是相同的,Inception V4需要人工设计;
  • ResNeXt是先进行1*1卷积然后执行单位加,Inception V4是先拼接再执行1*1卷积。
  • 增大Cardinality比增大模型的width或者depth效果更好
  • 在更多环境中发现InceptionV4效果是优于ResNeXt
  • 类似结构的ResNeXt的运行速度应该是优于V4的

列举了 ResNet-50 和 ResNeXt-50 的内部结构,另外最后两行说明二者之间的参数复杂度差别不大。

  • 与 ResNet 相比,ResNeXt 参数更少,效果更好,结构更加简单,更方便设计
  • 相同层数的ResNet和ResNeXt的对比:(32*4d表示32个paths,每个path的宽度为4,如fig3)。实验结果表明ResNeXt和ResNet的参数复杂度差不多,但是其训练误差和测试误差都降低了。
    在这里插入图片描述
    32*4d:
  • 32指进入网络的第一个ResNeXt基本结构的分组数量C(即基数)为32
  • 4d depth每一个分组通道数为4
  • 所以第一个基本结构输入通道数为128

这里作者展示了三种相同的 ResNeXt blocks:
在这里插入图片描述

  1. 明确说明这三种结构严格等价,并且用这三种结构做出来的结果一模一样
  2. fig3.a 就是前面所说的aggregated residual transformations。
  3. fig3.b 则采用两层卷积后 concatenate,再卷积,有点类似 Inception-ResNet,只不过这里的 paths 都是相同的拓扑结构。
  4. fig 3.c采用的是grouped convolutions,这个 group 参数就是 caffe 的 convolusion 层的 group 参数,用来限制本层卷积核和输入 channels 的卷积,最早应该是 AlexNet 上使用,可以减少计算量。
  5. 这里 fig 3.c 采用32个 group,每个 group 的输入输出 channels 都是4,最后把channels合并。

总结

  • 作者的核心创新点就在于提出了 aggregrated transformations,用一种平行堆叠相同拓扑结构的blocks代替原来 ResNet 的三层卷积的block,在不明显增加参数量级的情况下提升了模型的准确率
  • 同时由于拓扑结构相同,超参数也减少了,便于模型移植。
  • ResNeXt的本质是分组卷积,通过变量基数(cardinality)来控制组的数量
  • 组卷积是普通卷积和深度可分卷积的一个折中办法,即每个分支产生的feature map的通道数为n(n>1)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值