目录
一、LeNet-5
1、模型架构
?2、模型特点
3、模型的网络介绍
二、AlexNet
1、模型架构
?2、模型特点
3、模型的网络介绍
三、VGGNet
1、VGG所有种类网络结构和所有种类网络结构的参数量
?2、VGG16网络结构图
3、VGG19网络结构图?
4、VGG特点
5、VGG潜在应用:迁移学习、可解释性分析
四、GoogLeNet
1、网络结构图
2、Inception结构
?3、网络特点
五、ResNet(残差网络)
1、ResNet34层模型的结构简图
?2、residual的两种结构
?3、网络特点
一、LeNet-5
1、模型架构
?2、模型特点
- 每个卷积层包含3个部分:卷积、池化和非线性激活函数。
- 使用卷积提前空间特征。
- 采用降采样(Subsample)的平均池化层(Average Pooling)。
- 使用双曲正切(Tanh)的激活函数。
- 最后用MLP作为分类器。
3、模型的网络介绍
- 输入:?灰度图像,通道为1,尺寸为1×32×32
- 第一层:卷积层。LeNet-5模型接受的输入层大小是1×32x32。卷积层的过滤器的尺寸是5x5,深度(卷积核个数)为6,不使用全0填充,步长为1。则这一层的输出的尺寸为32-5+1=28,深度为6。本层的输出矩阵大小为6×28×28。
- 第二层:池化层。这一层的输入是第一层的输出,是一个6×28x28=4704的节点矩阵。本层采用的过滤器为2x2的大小,长和宽的步长均为2,所以本层的输出矩阵大小为6×14x14。
- 第三层:卷积层。本层的输入矩阵大小为6×14x14,使用的过滤器大小为5x5,深度为16。本层不使用全0填充,步长为1。本层的输出矩阵大小为16×10x10。
- 第四层:池化层。本层的输入矩阵大小是16×10x10,采用的过滤器大小是2x2,步长为2,本层的输出矩阵大小为16×5x5。
- 第五层:全连接层。本层的输入矩阵大小为16×5x5。将此矩阵中的节点拉成一个向量,那么这就和全连接层的输入一样了,本层的输出节点个数为120。
- 第六层:全连接层。本层的输入节点个数为120个,输出节点个数为84个。
- 第七层:全连接层。本层的输入节点为84个,输出节点个数为10个。
二、AlexNet
AlexNet相比传统的CNN,主要改动包括Data Augmentation(数据增强)、Dropout方法,激活函数用ReLU代替了传统的Tanh或者Siigmoid、采用了Local Response Normalization(LRN,实际就是利用临近的像素数据做归一化,(现在基本不用了))、Overlapping Pooling(有重叠,即Pooling的步长比Pooling Kernel的对应边要小)、多GPU并行。
1、模型架构
AlexNet是2012年ILSVRC 2012(ImageNet Large Scale Visual Recognition Challenge)竞赛的冠军网络,分类准确率由传统方法的 70%+提升到 80%+(当时传统方法已经进入瓶颈期,所以这么大的提升是非常厉害的)。它是由Hinton和他的学生Alex Krizhevsky设计的。也是在那年之后,深度学习开始迅速发展。下图是从AlexNet原论文中截取的网络结构图
?2、模型特点
(1)首次利用 GPU 进行网络加速训练。
(2)使用了 ReLU 激活函数,而不是传统的 Sigmoid 激活函数以及 Tanh 激活函数。
(3)使用了 LRN 局部响应归一化。
(4)在全连接层的前两层中使用了 Dropout方法按一定比例随机失活神经元,以减少过拟合。
(5)接着给出经卷积或池化后的矩阵尺寸大小计算公式:
?N = (W ? F + 2P ) / S + 1
其中W是输入图片大小,F是卷积核或池化核的大小, P是padding的像素个数(p = same, p取0, p = vaild, p取非0) ,S是步距,一般来说池化层没有padding。
3、模型的网络介绍
接下来我们对网络的每一层进行详细的分析:
- 卷积层1(由于使用了2块GPU,所以卷积核的个数需要乘以2):
Conv1: kernels:48*2=96;kernel_size:11;padding:[1, 2] ;stride:4
其中kernels代表卷积核的个数,kernel_size代表卷积的尺寸,padding代表特征矩阵上下左右补零的参数,stride代表步距
输入的图像shape: [224, 224, 3], 输出特征矩阵的shape: [55, 55, 96]
shape计算:N = (W ? F + 2P ) / S + 1 = [ 224 - 11 + (1 + 2)] / 4 + 1 = 55
Maxpool1: kernel_size:3;pading: 0;stride:2
其中kernel_size是池化核大小,padding代表特征矩阵上下左右补零的参数,stride代表步距
输入特征矩阵的shape: [55, 55, 96], 输出特征矩阵的shape: [27, 27, 96]
shape计算:N = (W ? F + 2P ) / S + 1 = (55 - 3) / 2 + 1 = 27
Conv2: kernels:128*2=256; kernel_size:5; padding: [2, 2]; stride:1
输入特征矩阵的shape:[27, 27, 96], 输出特征矩阵的shape: [27, 27, 256]
shape计算:N = (W ? F + 2P ) / S + 1 = (27 - 5 + 4) / 1 + 1 = 27
Maxpool2: kernel_size:3; pading: 0; stride:2
输入特征矩阵的shape: ?[27, 27, 256],输出特征矩阵的shape: [13, 13, 256]
shape计算:N = (W ? F + 2P ) / S + 1 = (27 - 3) / 2 + 1 = 13
Conv3: kernels:192*2=384; kernel_size:3; padding: [1, 1]; stride:1
输入特征矩阵shape:[13, 13, 256], 输出特征矩阵shape: [13, 13, 384]
shape计算:N = (W ? F + 2P ) / S + 1 = (13 - 3 + 2) / 1 + 1 = 13
Conv4: kernels:192*2=384; kernel_size:3; padding: [1, 1]; stride:1
输入特征矩阵shape:[13, 13, 384], 输出特征矩阵shape: [13, 13, 384]
shape计算:N = (W ? F + 2P ) / S + 1 = (13 - 3 + 2) / 1 + 1 = 13
Conv5: kernels:128*2=256; kernel_size:3; padding: [1, 1]; stride:1
输入特征矩阵shape:[13, 13, 384],输出特征矩阵shape: [13, 13, 256]
shape计算:N = (W ? F + 2P ) / S + 1 = (13 - 3 + 2) / 1 + 1 = 13
Maxpool3: kernel_size:3 padding: 0 stride:2
输入特征矩阵shape:[13, 13, 256] ,输出特征矩阵shape: [6, 6, 256]
shape计算:N = (W ? F + 2P ) / S + 1 = (13 - 3) / 2 + 1 = 6
unit_size: 4096 (unit_size为全连接层节点个数,两块GPU所以翻倍)
unit_size: 4096
unit_size: 1000(该层为输出层,输出节点个数对应你分类任务的类别个数)
三、VGGNet
?VGG很好地继承了AlexNet的特点,同时采用了更小的卷积核(3*3)堆叠来代替大的卷积核,并且网络更深(VGG-16,VGG-19)。
1、VGG所有种类网络结构和所有种类网络结构的参数量
表中的卷积层(conv3-kernels,其中kernels代表卷积核的个数)全部都是大小为3x3,步距为1,padding为1的卷积操作(经过卷积后不会改变特征矩阵的高和宽)。最大池化下采样层全部都是池化核大小为2,步距为2的池化操作,每次通过最大池化下采样后特征矩阵的高和宽都会缩减为原来的一半。我们通常使用的VGG模型是表格中的VGG16(D)配置。根据表格中的配置信息以及刚刚讲的卷积层和池化层的详细参数就能搭建出VGG网络了。
?2、VGG16网络结构图
?卷积层全部采用3*3, stride = 1, padding = same, 池化层全部采用max pooling,大小为2*2,stride = 2
?VGG的第一层全连接层占据了绝大部分参数原因:需要将上一层7×7×512维度的向量拉平放到1×1×4096维的全连接层,则每个节点都需要接受7×7×512,所以是7×7×512×4096个参数。
3、VGG19网络结构图?
?
好处: ??①深度变深了; ??②非线性次数变多了,可以让模型学习到更多非线性的决策边界; ??③学习能力变得更好,表示空间类型变得更大; ??④参数量更少,比如两个3×3卷积,可以代替一个5×5卷积,参数量减少从:5×5变成2×3×3。?
下面给出一个示例:使用7x7卷积层所需参数,与堆叠三个3x3卷积层所需参数(假设输入输出特征矩阵深度channel都为C)
如果使用一层卷积层大小为7的卷积所需参数(第一个C代表输入特征矩阵的channel,第二个C代表卷积核的个数也就是输出特征矩阵的深度):
如果使用三层卷积层大小为3的卷积所需参数:
经过对比明显使用3层大小为3x3的卷积层比使用一层7x7的卷积层参数更少
4、VGG特点
- 关注深度
- 固定其他参数
- 加入更多的卷积层来增加深度
- 使用3×3的卷积核
- 3×3卷积核、更深的网络的好处:
- 感受野:6个3×3=3个5×5=2个7×7
- 进行更多次的非线性操作。增强了CNN对特征的学习能力
- 参数不会爆炸,参数集中在全连接层。
- 1×1卷积核的好处:
- 不影响输入输出维数
- 引入非线性变换。
- 参数少
- 其他用法:
5、VGG潜在应用:迁移学习、可解释性分析
????????使用VGG做迁移学习时,前面层网络全部冻结,只需要修改最后一层,比如你有2622个类别进行分类,只需要将最后一层修改为1×1×2622的格式之后再进行训练。
??用VGG作为迁移学习的思路:把VGG作为一个特征提取器,输入图像获得4096维度的向量,然后再用一个简单的分类器,比如线性支持向量机,对这个向量进行分类,这个简单的分类器可以在更小的数据集上。
?????????因为VGG是一个经典的串行的卷积神经网络,它没有引入跨层连接的技巧,所以最后它提取的feature map是包含图像的位置信息的,比如最后提取的feature map的左上角对应的就是原图的左上角区域,feature map的右上角对应的就是原图的右上角区域。可以把它预测出的类别在原图上可视化显示出来。
四、GoogLeNet
GoogLeNet网络更深,但主要创新点在于它的Inception模块,这是一个网中网(Network In Nework)的结构,即原来的节点也是一个网络。相比于前述几个网络,用了Inception之后整个网络结构的宽度和深度都可扩大,能够带来2~3倍的性能提升。
1、网络结构图
首先说说该网络中的亮点:
(1)引入了Inception结构(融合不同尺度的特征信息)
(2)使用1x1的卷积核进行降维以及映射处理 (虽然VGG网络中也有,但该论文介绍的更详细)
(3)添加两个辅助分类器帮助训练
- 着两个辅助分类器的输入分别来自Inception(4a)和Inception(4d)。
- 辅助分类器的第一层是一个平均池化下采样层,池化核大小为5x5,stride=3
- 第二层是卷积层,卷积核大小为1x1,stride=1,卷积核个数是128
- 第三层是全连接层,节点个数是1024
- 第四层是全连接层,节点个数是1000(对应分类的类别个数)
?
(4)丢弃全连接层,使用平均池化层(大大减少模型参数,除去两个辅助分类器,网络大小只有vgg的1/20)
2、Inception结构
左图呢,是论文中提出的inception原始结构,右图是inception加上降维功能的结构。
inception结构一共有4个分支,也就是说我们的输入的特征矩阵并行的通过这四个分支得到四个输出,然后在在将这四个输出在深度维度(channel维度)进行拼接得到我们的最终输出(注意,为了让四个分支的输出能够在深度方向进行拼接,必须保证四个分支输出的特征矩阵高度和宽度都相同)。
分支1是卷积核大小为1x1的卷积层,stride=1,
分支2是卷积核大小为3x3的卷积层,stride=1,padding=1(保证输出特征矩阵的高和宽和输入特征矩阵相等),
分支3是卷积核大小为5x5的卷积层,stride=1,padding=2(保证输出特征矩阵的高和宽和输入特征矩阵相等),
分支4是池化核大小为3x3的最大池化下采样,stride=1,padding=1(保证输出特征矩阵的高和宽和输入特征矩阵相等)。
对比左图,就是在分支2,3,4上加入了卷积核大小为1x1的卷积层,目的是为了降维,减少模型训练参数,减少计算量,下面我们看看1x1的卷积核是如何减少训练模型参数的。同样是对一个深度为512的特征矩阵使用64个大小为5x5的卷积核进行卷积,不使用1x1卷积核进行降维话一共需要819200个参数,如果使用1x1卷积核进行降维一共需要50688个参数,明显少了很多。
?每个卷积层的卷积核个数如何确定呢,下面是原论文中给出的参数列表,对于我们搭建的Inception模块,所需要使用到参数有#1x1, #3x3reduce, #3x3, #5x5reduce, #5x5, poolproj,这6个参数,分别对应着所使用的卷积核个数。
再看看第三层的参数计算:
总的参数表:?
?3、网络特点
(1)GoogLeNet采用了模块化的结构(Inception结构),方便增添和修改; (2)网络最后采用了average pooling来代替全连接层,该想法来自NIN(Network in Network),事实证明这样可以将准确率提高0.6%。但是,实际在最后还是加了一个全连接层,主要是为了方便对输出进行灵活调整; (3)虽然移除了全连接,但是网络中依然使用了Dropout ; (在avg pooling之后,FC之前) (4)为了缓解梯度消失,网络额外增加了2个辅助的softmax用于向前传导梯度(辅助分类器Auxililary Classifier)。辅助分类器是将中间某一层的输出用作分类,并按一个较小的权重(0.3)加到最终分类结果中,这样相当于做了模型融合,同时给网络增加了反向传播的梯度信号。
五、ResNet(残差网络)
ResNet在网络深度上有了进一步探索。但主要的创新在于残差模块(residual block),网络提出本质上还是要解决增大网络深度导致难以收敛的问题。这种借鉴了Highway Network思想的网络相当于旁边专门开个通道使得输入可以直达输出,而优化的目标由原来的拟合输出H(x)变成输出和输入的差H(x) - x,其中H(x)是某一层原始的期望映射输出,x是输入。
1、ResNet34层模型的结构简图
对于我们ResNet18/34/50/101/152,表中conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层残差结构都是虚线残差结构。因为这一系列残差结构的第一层都有调整输入特征矩阵shape的使命(将特征矩阵的高和宽缩减为原来的一半,将深度channel调整成下一层残差结构所需要的channel)。为了方便理解,下面给出了ResNet34的网络结构图,图中简单标注了一些信息。
?对于我们ResNet50/101/152,其实在conv2_x所对应的一系列残差结构的第一层也是虚线残差结构。因为它需要调整输入特征矩阵的channel,根据表格可知通过3x3的max pool之后输出的特征矩阵shape应该是[56, 56, 64],但我们conv2_x所对应的一系列残差结构中的实线残差结构它们期望的输入特征矩阵shape是[56, 56, 256](因为这样才能保证输入输出特征矩阵shape相同,才能将捷径分支的输出与主分支的输出进行相加)。所以第一层残差结构需要将shape从[56, 56, 64] --> [56, 56, 256]。注意,这里只调整channel维度,高和宽不变(而conv3_x, conv4_x, conv5_x所对应的一系列残差结构的第一层虚线残差结构不仅要调整channel还要将高和宽缩减为原来的一半)。
在ResNet网络提出之前,传统的卷积神经网络都是通过将一系列卷积层与下采样层进行堆叠得到的。但是当堆叠到一定网络深度时,就会出现两个问题。1)梯度消失或梯度爆炸。 2)退化问题(degradation problem)。在ResNet论文中说通过数据的预处理以及在网络中使用BN(Batch Normalization)层能够解决梯度消失或者梯度爆炸问题。如果不了解BN层可参考这个链接。但是对于退化问题(随着网络层数的加深,效果还会变差,如下图所示)并没有很好的解决办法。
?所以ResNet论文提出了residual结构(残差结构)来减轻退化问题。下图是使用residual结构的卷积网络,可以看到随着网络的不断加深,效果并没有变差,反而变的更好了。
?2、residual的两种结构
我们就来分析下论文中的残差结构(residual),下图是论文中给出的两种残差结构。左边的残差结构是针对层数较少网络,例如ResNet18层和ResNet34层网络。右边是针对网络层数较多的网络,例如ResNet101,ResNet152等。为什么深层网络要使用右侧的残差结构呢。因为,右侧的残差结构能够减少网络参数与运算量。同样输入、输出一个channel为256的特征矩阵,如果使用左侧的残差结构需要大约1170648个参数,但如果使用右侧的残差结构只需要69632个参数。明显搭建深层网络时,使用右侧的残差结构更合适。
?
先对左侧的残差结构(针对ResNet18/34)进行一个分析。如下图所示,该残差结构的主分支是由两层3x3的卷积层组成,而残差结构右侧的连接线是shortcut分支也称捷径分支(注意为了让主分支上的输出矩阵能够与我们捷径分支上的输出矩阵进行相加,必须保证这两个输出特征矩阵有相同的shape)。如果刚刚仔细观察了ResNet34网络结构图的同学,应该能够发现图中会有一些虚线的残差结构。在原论文中作者只是简单说了这些虚线残差结构有降维的作用,并在捷径分支上通过1x1的卷积核进行降维处理。而下图右侧给出了详细的虚线残差结构,注意下每个卷积层的步距stride,以及捷径分支上的卷积核的个数(与主分支上的卷积核个数相同)。
?接着我们再来分析下针对ResNet50/101/152的残差结构,如下图所示。在该残差结构当中,主分支使用了三个卷积层,第一个是1x1的卷积层用来压缩channel维度,第二个是3x3的卷积层,第三个是1x1的卷积层用来还原channel维度(注意主分支上第一层卷积层和第二层卷积层所使用的卷积核个数是相同的,第三层是第一层的4倍)。该残差结构所对应的虚线残差结构如下图右侧所示,同样在捷径分支上有一层1x1的卷积层,它的卷积核个数与主分支上的第三层卷积层卷积核个数相同,注意每个卷积层的步距。(注意:原论文中,在下图右侧虚线残差结构的主分支中,第一个1x1卷积层的步距是2,第二个3x3卷积层步距是1。但在pytorch官方实现过程中是第一个1x1卷积层的步距是1,第二个3x3卷积层步距是2,这么做的好处是能够在top1上提升大概0.5%的准确率。
模型结构图中,我们可以清楚的”实线“和”虚线“两种连接方式, 1)实线的的Connection部分都是3x3x64的特征图,他们的channel个数一致,所以采用计算方式: y=F(x)+x 2)虚线的的Connection部分分别是3x3x64和3x3x128的特征图,他们的channel个数不同(64和128),所以采用计算方式: y=F(x)+Wx 其中W是卷积操作,用来调整x的channel维度的
?下面这幅图是原论文给出的不同深度的ResNet网络结构配置,注意表中的残差结构给出了主分支上卷积核的大小与卷积核个数,表中的xN表示将该残差结构重复N次。那到底哪些残差结构是虚线残差结构呢。
?3、网络特点
(1)提出residual结构(残差结构),并搭建超深的网络结构(突破1000层)
(2)使用Batch Normalization加速训练(丢弃dropout)
参考资料:LeNet、AlexNet、VggNet、GoogLeNet、ResNet、MobileNet网络详解_boss-dog的博客-CSDN博客_vggnet
|