经典CNN卷积神经网络发展史
作者:RayChiu_Labloy
版权声明:著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处
目录
回顾ANN、DNN、CNN
CNN发展综合介绍
LeNet-5
论文
CNN的鼻祖
5的含义
基本单元构成
LeNet-5共包含8层
1、输入层:
2、C1层
3、S2层
4、C3层
5、S4层
6、C5层
7、F6层
8、output层
AlexNet
论文
简介
拓扑图和每层的组成信息图
特点:
利用分布式计算:
每层的超参数、参数量、计算量:
ZF Net
论文
简介
要点 :
DeConvNet反卷积可视化
ZFNet中反卷积可视化:
AlexNet可视化的意义:
总结
VGG Net
论文
简介和特点
编辑
总结连续小卷积优点:
思路上和inception对比:
GoogLeNet(Inception)V1
V1到V4的论文
14年挑战赛双雄GoogLeNet和VGG
通过深度和宽度暴力提升性能带来的问题
解决方案
Inception的基本结构
Inception V1参数少但效果好的原因除了模型层数更深、表达能力更强外,还有两点:
GoogleNet Inception V2
ICS问题
输入数据不再是“独立同分布”,导致了以下问题:
怎么使得输入分布满足独立同分布?
V2和V1的最大的不同就是,V2增加了Batch Normalization
BN应该放在激活层之前还是之后
ResNet
论文
详述
DenseNet
论文:
简述
创新点:
网络基本结构:
总结
总结
回顾ANN、DNN、CNN
非常详细的讲解让你深刻理解神经网络NN(neural network)_RayChiu757374816的博客-CSDN博客
详细讲解深层神经网络DNN_RayChiu757374816的博客-CSDN博客
让我们一起详细了解一下卷积神经网络CNN_RayChiu757374816的博客-CSDN博客
CNN发展综合介绍
CNN的开山之作是LeCun提出的LeNet-5,而其真正的爆发阶段是2012年AlexNet取得ImageNet比赛的分类任务的冠军,并且分类准确率远远超过利用传统方法实现的分类结果,该模型能够取得成功的原因主要有三个:
1.海量的有标记的训练数据,也就是李飞飞团队提供的大规模有标记的数据集ImageNet
2.计算机硬件的支持,尤其是GPU的出现,为复杂的计算提供了强大的支持
3.算法的改进,包括网络结构加深、数据增强(数据扩充)、ReLU、Dropout等
AlexNet之后,深度学习便一发不可收拾,分类准确率每年都被刷榜,下图展示了模型的变化情况,随着模型的变深,Top-5的错误率也越来越低,目前已经降低到了3.5%左右,同样的ImageNet数据集,人眼的辨识错误率大概为5.1%,也就是深度学习的识别能力已经超过了人类。
经典的网络有LeNet AlexNet VGGNet googleNet ResNet,这些网络除了LeNet,其他都是参加了比较有名的比赛并取得很不多的名次的。经典网络一般用于迁移学习,像大赛中的极端场景基本现实中不会遇到。下面我们来说一说各自网络特点和创新点,先从LeNet说起:
LeNet-5
论文
http://lushuangning.oss-cn-beijing.aliyuncs.com/CNN%E5%AD%A6%E4%B9%A0%E7%B3%BB%E5%88%97/Gradient-Based_Learning_Applied_to_Document_Recognition.pdf
CNN的鼻祖
98年,神经网络的鼻祖。
一种用于手写体字符识别的非常高效的卷积神经网络。
5的含义
LeNet-5中的5代表需要计算的参数层数,在之前我们讲CNN的时候提到过,需要训练参数的层有卷积层和全连接层,可对应上图数一下是5层,因此是LeNet-5,后边讲的VGG-16等是一个道理。
基本单元构成
上图网络结构图中显示的很清楚。它包括了两个卷积层,两个下采样层,两个全连接层和一个激活层,最后有一个sotfmax分类层。可以说,LeNet麻雀虽小,五脏俱全。包括了基本的卷积神经网络的所有单元。
所有的池化方法均采用平均池化,所有的激活函数都是sigmoid。
LeNet-5共包含8层
1、输入层:
N个32x32的训练样本,输入图像大小为32x32,比MNIST数据库中的字母大,这样做的原因是希望潜在的明显特征,如笔画断点或角点能够出现在最高层特征监测子感受野的中心。
2、C1层
输入图像大小:32x32
卷积核大小:5x5
卷积核个数:6
输出特征图数量:6
输出特征图大小:28x28(32-5+1)
神经元数量:4707(28x28x6)
连接数:122304((28x28x5x5x6)+(28x28x6))
可训练参数:156(5x5x6+6,权值+偏置)
3、S2层
输入图像大小:(28x28x6)
卷积核大小:2x2
卷积核个数:6
输出特征图数量:6
输出特征图大小:14x14(28/2,28/2)
神经元数量:1176(14x14x6)
连接数:5880((2x2x14x14x6)+(14x14x6))
可训练参数:12(1x6+6,权值+偏置)
备注:S2层每个单元的4个输入相加,乘以一个可训练参数,再加上一个可训练偏置。结果通过sigmoid函数计算。可训练系数和偏置控制着sigmoid函数的非线性程度。
如果系数比较小,那么运算近似于线性运算,下采样相当于模糊图像。
如果系数比较大,根据偏置的大小下采样可以被看成是有噪声的“或”运算或者有噪声的“与”运算。
每个单元的2*2感受野并不重叠,因此S2中每个特征图的大小是C1中特征图大小的1/4(行和列各1/2)。
4、C3层
输入图像大小:(14x14x6)
卷积核大小:5x5
卷积核个数:16
输出特征图数量:16
输出特征图大小:10x10(14-5+1)
神经元数量:1600(10x10x16)
连接数:151600(1516x10x10)
可训练参数:1516
备注:C3层也是一个卷积层,通过5x5的卷积核去卷积S2层,然后得到的特征图map就有10x10个神经元,但是有16种不同的卷积核,就存在16个不同的特征map。
C3中每个特征图由S2中的所有6个或几个特征图组合而成,为什么不把S2中的所有特征图都连接到C3的特征图呢:
第一,不完全的连接机制将连接的数量保持在合理的范围内
第二,也是最重要的,这样一来就可以破坏网络的对称性,由于不同的特征图有不同的输入,所以迫使他们抽取不同的特征。
5、S4层
输入图像大小:(10x10x16)
卷积核大小:2x2
卷积核个数:16
输出特征图数量:16
输出特征图大小:5x5x16
神经元数量:400(5x5x16)
连接数:2000((2x2x5x5x16)+(5x5x16))
可训练参数:32((1+1)x16)
备注:S4是一个下采样层,由16个5x5大小的特征图构成,特征图的每个单元与C3中相应的特征图的2x2邻域相连,S4层有32个可训练参数(每个特征图1个因子和一个偏置)和2000个连接。
6、C5层
输入图像大小:5x5x16
卷积核大小:5x5
卷积核个数:120
输出特征图数量:120
输出特征图大小:1X1(5-5+1)
神经元数量:120(1x120)
连接数:48120(5x5x16x120x1+120x1)
可训练参数:48120(5x5x16x120+120)
备注:C5层是一个卷积层,有120个特征图,每个单元与S4层的全部16个单元的5x5邻域相连,构成了S4和C5的全连接,之所以仍将C5标识为卷积层而非全连接层是因为如果LeNet-5的输入变大,而其他的保持不变,那么此时特征图的维数就会比1x1大。
7、F6层
输入图像大小:(1x1x120)
卷积核大小:1x1
卷积核个数:84
输出特征图数量:1
输出特征图大小:84
神经元数量:84
连接数:10164(120x84+84)
可训练参数:10164(120x84+84)
备注:F6有84个单元(之所以选择84是源于输出层的设计),与C5层相连,有10164个可训练参数,类似经典的全连接神经网络,F6层计算输入向量和权重向量之间的点积,再加上一个偏置,之后将其传递给sigmoid函数产生一个单元i的状态。
8、output层
输入图像大小:1x84
输出特征图数量:1x10
然后我们再总体看看2012年AlexNet出来后CNN爆发期后的一些经典网络AlexNet VGG GoogLeNet ResNet:
AlexNet
论文
https://proceedings.neurips.cc/paper/2012/file/c399862d3b9d6b76c8436e924a68c45b-Paper.pdf
简介
AlexNet是2012年ILSVRC ImageNet竞赛(图像识别大赛)冠军, 这个比赛被誉为计算机视觉的年度奥林匹克竞赛,全世界的团队相聚一堂,看看是哪家的视觉模型表现最为出色。
数据集为224*224*3图像一共几十万上百万图片,做1000分类。
拓扑图和每层的组成信息图
特点:
使用ImageNet数据训练网络,ImageNet数据库含有1500多万个带标记的图像,超过2.2万个类别。
使用ReLU代替传统正切函数引入非线性(ReLU比传统正切函数快几倍,缩短训练时间)。
使用了图像转化(image translation)、水平反射(horizontal reflection)和补丁提取(patch extraction)这些数据增强技术。
用dropout层应对训练数据过拟合的问题。
数据的标准化
使用批处理随机梯度下降训练模型,注明动量衰减值和权重衰减值。
使用两台GTX 580 GPU,训练了5到6天
利用分布式计算:
AlexNet使用CUDA加速深度卷积网络的训练,利用GPU强大的并行计算能力,处理神经网络训练时大量的矩阵运算,AlexNet使用两个GTX580的GPU进行训练,单个GTX580只有3GB的显存,限制了可训练网络的最大规模,因此将其分布在两个GPU上,在每个GPU的显存中储存一般的神经元参数。
每层的超参数、参数量、计算量:
AlexNet包含了6亿三千万个连接,6000万个参数和65万个神经元,拥有5个卷积层,其中3个卷积层后面连接了最大池化层,最后还有3个全连接层。
虽然前几个卷积层的计算量很大,但是参数量都很小,在1M左右甚至更小。只占AlexNet总参数量的很小一部分,这就是卷积层的作用,可以通过较小的参数量有效的提取特征。
ZF Net
论文
https://arxiv.org/pdf/1311.2901.pdf
简介
2013年的冠军是纽约大学Matthew Zeiler 和 Rob Fergus设计的网络 ZF Net,错误率 11.2%。ZF Net模型更像是AlexNet架构的微调优化版。
在这篇题为“Visualizing and Understanding Convolutional Neural Networks”的论文中,Zeiler和Fergus从大数据和GPU计算力让人们重拾对CNN的兴趣讲起,讨论了研究人员对模型内在机制知之甚少,一针见血地指出“发展更好的模型实际上是不断试错的过程”。虽然我们现在要比3年前知道得多一些了,但论文所提出的问题至今仍然存在!这篇论文的主要贡献在于提出了一个比AlexNet稍微好一些的模型并给出了细节,还提供了一些制作可视化特征图值得借鉴的方法。
要点 :
除了一些小的修改,整体架构非常类似AlexNet。
AlexNet训练用了1500万张图片,而ZFNet只用了130万张。
AlexNet在第一层中使用了大小为11×11的滤波器,而ZF使用的滤波器大小为7x7,整体处理速度也有所减慢。做此修改的原因是,对于输入数据来说,第一层卷积层有助于保留大量的原始象素信息。11×11的滤波器漏掉了大量相关信息,特别是因为这是第一层卷积层。
随着网络增大,使用的滤波器数量增多。
利用ReLU的激活函数,将交叉熵代价函数作为误差函数,使用批处理随机梯度下降进行训练。
使用一台GTX 580 GPU训练了12天。
开发可视化技术“解卷积网络”(Deconvolutional Network),有助于检查不同的特征激活和其对输入空间关系。名字之所以称为“deconvnet”,是因为它将特征映射到像素(与卷积层恰好相反)。
DeConvNet反卷积可视化
反卷积概念:怎样通俗易懂地解释反卷积? - 知乎
DeConvNet工作的基本原理是,每层训练过的CNN后面都连一层“deconvet”,它会提供一条返回图像像素的路径。输入图像进入CNN之后,每一层都计算激活。然而向前传递。现在,假设我们想知道第4层卷积层某个特征的激活值,我们将保存这个特征图的激活值,并将这一层的其他激活值设为0,再将这张特征图作为输入送入deconvnet。Deconvnet与原来的CNN拥有同样的滤波器。输入经过一系列unpool(maxpooling倒过来),修正,对前一层进行过滤操作,直到输入空间满。
这一过程背后的逻辑在于,我们想要知道是激活某个特征图的是什么结构。下面来看第一层和第二层的可视化。
ConvNet的第一层永远是低层特征检测器,在这里就是对简单的边缘、颜色进行检测。第二层就有比较圆滑的特征了。再来看第三、第四和第五层。
这些层展示出了更多的高级特征,比如狗的脸和鲜花。值得一提的是,在第一层卷积层后面,我们通常会跟一个池化层将图像缩小(比如将 32x32x32 变为16x16x3)。这样做的效果是加宽了第二层看原始图像的视野。更详细的内容可以阅读论文。
ZFNet中反卷积可视化:
一个卷积层加一个对应的反卷积层;
输入是feature map,输出是图像像素;
过程包括反池化操作、relu和反卷积过程。
其中反池化:
严格意义上的反池化是无法实现的。作者采用近似的实现,在训练过程中记录每一个池化操作的一个z*z的区域内输入的最大值的位置,这样在反池化的时候,就将最大值返回到其应该在的位置,其他位置的值补0。
使用原卷积核的转秩和feature map进行卷积。反卷积其实是一个误导,这里真正的名字就是转秩卷积操作。
上图左边是一个解卷积层,右边为一个卷积层,解卷积层将会重建一个来自下一层的卷积特征近似版本,图中使用switch来记录在卷积网中进行最大池化操作时每个池化区域的局部最大值的位置,经过非池化操作后,原来的非最大值的位置全都置为0。
AlexNet可视化的意义:
该论文是在AlexNet基础上进行了一些细节的改动,网络结构上并没有太大的突破。该论文最大的贡献在于通过使用可视化技术揭示了神经网络各层到底在干什么,起到了什么作用。
从科学的观点出发,如果不知道神经网络为什么取得了如此好的效果,那么只能靠不停的实验来寻找更好的模型。
使用一个多层的反卷积网络(Deconv可视化)来可视化训练过程中特征的演化及发现潜在的问题;不仅有助于弄清CNN的内在机理,同时根据遮挡图像局部对分类结果的影响来探讨对分类任务而言到底那部分输入信息更重要, 为优化网络架构提供了有用的信息。
总结
1.提出了一种可视化方法;
2.发现学习到的特征远不是无法解释的,而是特征间存在层次性,层数越深,特征不变性越强,类别的判别能力越强(卷积神经网络具有平移和缩放不变性,并且层数越高不变性越强。但是不具有旋转不变性。);
3.通过可视化模型中间层,在alexnet基础上进一步提升了分类效果;
4. 遮挡实验表明分类时模型和局部块的特征高度相关;
5.模型的深度很关键;
6.预训练模型可以在其他数据集上fine-tuning得到很好的结果。
VGG Net
论文
https://arxiv.org/abs/1409.1556
简介和特点
VGG16结构图
简单、有深度,这就是2014年错误率7.3%的模型VGG Net(ILSVRC 2014亚军)。牛津大学的Karen Simonyan 和 Andrew Zisserman Main Points 利用CNN探索了卷积神经网络的深度与其性能之间的关系,通过反复堆叠3*3的小型卷积核和2*2的最大池化层,VGGNet成功地构筑了16~19层深的卷积神经网络.
输入做了预处理,在训练集中的每个像素减去RGB的均值,并且为了获得224x224的输入图像,要在每个SGD迭代中对每张重新缩放的图像进行随机裁剪,为了增强数据集,裁剪的图像还要随机水平翻转和RGB色彩偏移。;
激活函数不使用LRN,这种标准化并不能带来很大的提升,反而会导致更多的内存消耗和计算时间
VGG使用3x3的滤波器, 和AlexNet在第一层使用11x11的滤波器以及ZF Net 7x7的滤波器作用完全不同。作者认为两个3x3的卷积层组合可以实现5x5的有效感受野。这就在保持滤波器尺寸较小的同时模拟了大型滤波器,减少了参数。此外,有两个卷积层就能够使用两层ReLU。
它再次强调CNN必须够深,视觉数据的层次化表示才有用。深的同时结构简单。
更大的深度和更小的卷积核带来隐式正则化加上一些层的预训练,让在相比AlexNet网络更深,参数更多的情况下,VGGNet能在更少的周期内收敛.
总结连续小卷积优点:
a.W参数减少少
b.增加非线性变化,增加了非线性表达能力,使得分割平面更具有可分性
c.可以感受更小的物体视野
思路上和inception对比:
相对于冠军inception的并行思路来说,VGG-16是串行思路
GoogLeNet(Inception)V1
V1到V4的论文
[v1] Going Deeper withConvolutions, 6.67% test error,2014.9
论文地址:http://arxiv.org/abs/1409.4842
[v2] Batch Normalization:Accelerating Deep Network Training by Reducing Internal Covariate Shift, 4.8% test error,2015.2
论文地址:http://arxiv.org/abs/1502.03167
[v3] Rethinking theInception Architecture for Computer Vision, 3.5%test error,2015.12
论文地址:http://arxiv.org/abs/1512.00567
[v4] Inception-v4,Inception-ResNet and the Impact of Residual Connections on Learning, 3.08% test error,2016.2
论文地址:http://arxiv.org/abs/1602.07261
14年挑战赛双雄GoogLeNet和VGG
2014年,GoogLeNet和VGG是当年ImageNet挑战赛(ILSVRC14)的双雄,GoogLeNet获得了第一名、VGG获得了第二名,这两类模型结构的共同特点是层次更深了。VGG继承了LeNet以及AlexNet的一些框架结构,而GoogLeNet则做了更加大胆的网络结构尝试,虽然深度有22层更深了,但计算量只有15亿次浮点运算,但大小却比AlexNet和VGG小很多,GoogleNet参数为500万个,AlexNet参数个数是GoogleNet的12倍,VGGNet参数又是AlexNet的3倍,因此在内存或计算资源有限时,GoogleNet是比较好的选择;从模型结果来看,GoogLeNet的性能却更加优越。
GoogLeNet是谷歌(Google)研究出来的深度网络结构,为什么不叫“GoogleNet”,而叫“GoogLeNet”,据说是为了向“LeNet”致敬,因此取名为“GoogLeNet”
那么,GoogLeNet是如何进一步提升性能的呢?
通过深度和宽度暴力提升性能带来的问题
先看一下CNN演变过程:
一般来说,提升网络性能最直接的办法就是增加网络深度和宽度,深度指网络层次数量、宽度指神经元数量。但这种方式存在以下问题:
(1)参数太多,如果训练数据集有限,很容易产生过拟合;
(2)网络越大、参数越多,计算复杂度越大,难以应用;
(3)网络越深,容易出现梯度弥散问题(梯度越往后穿越容易消失),难以优化模型。
所以,有人调侃“深度学习”其实是“深度调参”。
解决方案
解决这些问题的方法当然就是在增加网络深度和宽度的同时减少参数,为了减少参数,自然就想到将全连接变成稀疏连接。但是在实现上,全连接变成稀疏连接后实际计算量并不会有质的提升,因为大部分硬件是针对密集矩阵计算优化的,稀疏矩阵虽然数据量少,但是计算所消耗的时间却很难减少。
那么,有没有一种方法既能保持网络结构的稀疏性,又能利用密集矩阵的高计算性能。大量的文献表明可以将稀疏矩阵聚类为较为密集的子矩阵来提高计算性做到能,就如人类的大脑是可以看做是神经元的重复堆积,因此,GoogLeNet团队提出了Inception网络结构,就是构造一种“基础神经元”结构,来搭建一个稀疏性、高计算性能的网络结构。
Inception的基本结构
该结构将CNN中常用的卷积(1x1,3x3,5x5)、池化操作(3x3)堆叠在一起(卷积、池化后的尺寸相同,将通道相加),一方面增加了网络的宽度,另一方面也增加了网络对尺度的适应性。
采用不同大小的卷积核意味着不同大小的感受野,最后拼接意味着不同尺度特征的融合,之所以卷积核采用1x1,3x3和5x5,主要是为了方便对齐,设定卷积步长stride=1,只要分别设定padding=0,1,2,那么卷积之后便可以得到相同维度的特征。
网络卷积层中的网络能够提取输入的每一个细节信息,同时5x5的滤波器也能够覆盖大部分接受层的的输入。还可以进行一个池化操作,以减少空间大小,降低过度拟合。在这些层之上,在每一个卷积层后都要做一个ReLU操作,以增加网络的非线性特征。
然而这个Inception原始版本,所有的卷积核都在上一层的所有输出上来做,而那个5x5的卷积核所需的计算量就太大了,造成了特征图的厚度很大,为了避免这种情况,在3x3前、5x5前、max pooling后分别加上了1x1的卷积核,以起到了降低特征图厚度的作用,这也就形成了Inception v1的网络结构,如下图所示:
1x1卷积的主要目的是为了减少维度,还用于修正线性激活(ReLU)。比如,上一层的输出为100x100x128,经过具有256个通道的5x5卷积层之后(stride=1,pad=2),输出数据为100x100x256,其中,卷积层的参数为128x5x5x256= 819200。而假如上一层输出先经过具有32个通道的1x1卷积层,再经过具有256个输出的5x5卷积层,那么输出数据仍为为100x100x256,但卷积参数量已经减少为128x1x1x32 + 32x5x5x256= 204800,大约减少了4倍。
Inception V1参数少但效果好的原因除了模型层数更深、表达能力更强外,还有两点:
其一,去除了最后的全连接层,用全局平均池化层(即将图片尺寸变为1*1)来取代它。全连接层几乎占据了AlexNet或VGGNet中90%的参数量,而且会引起过拟合,去除全连接层后模型训练更快并且减轻了过拟合。
其二,Inception V1中精心设计的Inception Module提高了参数的利用效率,其结构如上图所示。这一部分也借鉴了Network In Network的思想,形象的解释就是Inception Module本身如同大网络中的一个小网络,其结构可以反复堆叠在一起形成大网络。
GoogleNet Inception V2
ICS问题
作者认为,网络训练过程中参数不断改变导致后续每一层输入的分布也发生变化,而学习的过程又要使得每一层适应输入的分布,因此我们不得不降低学习率、小心的初始化,分布发生变化称为internal covariate shift, 简称 ICS.
输入数据不再是“独立同分布”,导致了以下问题:
1、上层网络需要不断适应新的输入数据分布,降低学习速度。
2、下层输入的变化可能趋向于变大或者变小,导致上层落入饱和区,使得学习过早停止。
3、每层的更新都会影响到其它层,因此每层的参数更新策略需要尽可能的谨慎。
怎么使得输入分布满足独立同分布?
1.PCA白化与ZCA白化
2.Normalization
V2和V1的最大的不同就是,V2增加了Batch Normalization
Inception V2学习了VGGNet,用两个3x3的卷积代替5x5的卷积,用以降低参数量并减轻过拟合,还提出了著名的Batch Normalization方法,该方法是一个很有效的正则化的方法,可以让大型卷积网络的训练速度加快很多倍,同时收敛后的分类准确率也可以得到大幅度的提高。
BN应该放在激活层之前还是之后
作者在文章中说应该把BN放在激活函数之前,这是因为Wx+b具有更加一致和非稀疏的分布。但是也有人做实验表明放在激活函数后面效果更好。这是实验链接,里面有很多有意思的对比实验:https://github.com/ducha-aiki/caffenet-benchmark
ResNet
论文
https://arxiv.org/abs/1512.03385
详述
一说起“深度学习”,自然就联想到它非常显著的特点“深、深、深”(重要的事说三遍),越深越好吗?先看几个经典的图像识别深度学习模型:
这几个模型都是在世界顶级比赛中获奖的著名模型,然而,一看这些模型的网络层次数量,似乎让人很失望,少则5层,多的也就22层而已,这些世界级模型的网络层级也没有那么深啊,这种也算深度学习吗?为什么不把网络层次加到成百上千层呢?
在网络很深的时候(56层相比20层),模型效果却越来越差了(误差率越高),并不是网络越深越好,因为层数越深,梯度在传播过程中会逐渐消失,导致无法对前面网络层的权重进行有效的调整。
实验结果得出:在不断加神经网络的深度时,模型准确率会先上升然后达到饱和,再持续增加深度时则会导致准确率下降,示意图如下:
那么我们作这样一个假设:假设现有一个比较浅的网络(Shallow Net)已达到了饱和的准确率,这时在它后面再加上几个恒等映射层(Identity mapping,也即y=x,输出等于输入),这样就增加了网络的深度,并且起码误差不会增加,也即更深的网络不应该带来训练集上误差的上升。而这里提到的使用恒等映射直接将前一层输出传到后面的思想,便是著名深度残差网络ResNet的灵感来源。
ResNet引入了残差网络结构(residual network),通过这种残差网络结构,可以把网络层弄的很深(据说目前可以达到1000多层),并且最终的分类效果也非常好,残差网络的基本结构如下图所示,很明显,该图是带有跳跃结构的:
残差网络借鉴了高速网络(Highway Network)的跨层链接思想,但对其进行改进(残差项原本是带权值的,但ResNet用恒等映射代替之)。
假定某段神经网络的输入是x,期望输出是H(x),即H(x)是期望的复杂潜在映射,如果是要学习这样的模型,则训练难度会比较大;
回想前面的假设,如果已经学习到较饱和的准确率(或者当发现下层的误差变大时),那么接下来的学习目标就转变为恒等映射的学习,也就是使输入x近似于输出H(x),以保持在后面的层次中不会造成精度下降。
在上图的残差网络结构图中,通过“shortcut connections(捷径连接)”的方式,直接把输入x传到输出作为初始结果,输出结果为H(x)=F(x)+x,当F(x)=0时,那么H(x)=x,也就是上面所提到的恒等映射。于是,ResNet相当于将学习目标改变了,不再是学习一个完整的输出,而是目标值H(X)和x的差值,也就是所谓的残差F(x) := H(x)-x,因此,后面的训练目标就是要将残差结果逼近于0,使到随着网络加深,准确率不下降。
这种残差跳跃式的结构,打破了传统的神经网络n-1层的输出只能给n层作为输入的惯例,使某一层的输出可以直接跨过几层作为后面某一层的输入,其意义在于为叠加多层网络而使得整个学习模型的错误率不降反升的难题提供了新的方向。
至此,神经网络的层数可以超越之前的约束,达到几十层、上百层甚至千层,为高级语义特征提取和分类提供了可行性。
ResNet在ILSVRC2015竞赛中惊艳亮相,一下子将网络深度提升到152层,将错误率降到了3.57,在图像识别错误率和网络深度方面,比往届比赛有了非常大的提升,ResNet毫无悬念地夺得了ILSVRC2015的第一名。如下图所示:
DenseNet
论文:
Densely Connected Convolutional Networks
论文链接:https://arxiv.org/pdf/1608.06993.pdf
代码的github链接:https://github.com/liuzhuang13/DenseNet
MXNet版本代码(有ImageNet预训练模型): https://github.com/miraclewkf/DenseNet
简述
这篇文章是CVPR2017的oral,非常厉害。文章提出的DenseNet(Dense Convolutional Network)主要还是和ResNet及Inception网络做对比,思想上有借鉴,但却是全新的结构,网络结构并不复杂,却非常有效!众所周知,最近一两年卷积神经网络提高效果的方向,要么深(比如ResNet,解决了网络深时候的梯度消失问题)要么宽(比如GoogleNet的Inception),而作者则是从feature入手,通过对feature的极致利用达到更好的效果和更少的参数。
创新点:
1)减轻了vanishing-gradient(梯度消失)
2)加强了feature的传递
3)更有效地利用了feature
4)一定程度上较少了参数数量
网络基本结构:
在深度学习网络中,随着网络深度的加深,梯度消失问题会愈加明显,目前很多论文都针对这个问题提出了解决方案,比如ResNet,Highway Networks,Stochastic depth,FractalNets等,尽管这些算法的网络结构有差别,但是核心都在于:create short paths from early layers to later layers(使用短连接把前层和后层连接)。那么作者是怎么做呢?延续这个思路,那就是在保证网络中层与层之间最大程度的信息传输的前提下,直接将所有层连接起来!
DenseNet的一个优点是网络更窄,参数更少,很大一部分原因得益于这种dense block的设计,后面有提到在dense block中每个卷积层的输出feature map的数量都很小(小于100),而不是像其他网络一样动不动就几百上千的宽度。同时这种连接方式使得特征和梯度的传递更加有效,网络也就更加容易训练。原文的一句话非常喜欢:Each layer has direct access to the gradients from the loss function and the original input signal, leading to an implicit deep supervision.直接解释了为什么这个网络的效果会很好。前面提到过梯度消失问题在网络深度越深的时候越容易出现,原因就是输入信息和梯度信息在很多层之间传递导致的,而现在这种dense connection相当于每一层都直接连接input和loss,因此就可以减轻梯度消失现象,这样更深网络不是问题。另外作者还观察到这种dense connection有正则化的效果,因此对于过拟合有一定的抑制作用,博主认为是因为参数减少了(后面会介绍为什么参数会减少),所以过拟合现象减轻。
这篇文章的一个优点就是基本上没有公式,不像灌水文章一样堆复杂公式把人看得一愣一愣的。文章中只有两个公式,是用来阐述DenseNet和ResNet的关系,对于从原理上理解这两个网络还是非常重要的。
第一个公式是ResNet的。这里的l表示层,xl表示l层的输出,Hl表示一个非线性变换。所以对于ResNet而言,l层的输出是l-1层的输出加上对l-1层输出的非线性变换。
第二个公式是DenseNet的。[x0,x1,…,xl-1]表示将0到l-1层的输出feature map做concatenation。concatenation是做通道的合并(即直接堆叠通道,而不对通道进行其他操作),就像Inception那样。而前面resnet是做值的相加,通道数是不变的。Hl包括BN,ReLU和3*3的卷积。
所以从这两个公式就能看出DenseNet和ResNet在本质上的区别,太精辟。
前面的图表示的是dense block,而下图表示的则是一个DenseNet的结构图,在这个结构图中包含了3个dense block。作者将DenseNet分成多个dense block,原因是希望各个dense block内的feature map的size统一,这样在做concatenation就不会有size的问题。
下表就是整个网络的结构图。这个表中的k=32,k=48中的k是growth rate,表示每个dense block中每层输出的feature map个数。为了避免网络变得很宽,作者都是采用较小的k,比如32这样,作者的实验也表明小的k可以有更好的效果。根据dense block的设计,后面几层可以得到前面所有层的输入,因此concat后的输入channel还是比较大的。另外这里每个dense block的3*3卷积前面都包含了一个1*1的卷积操作,就是所谓的bottleneck layer,目的是减少输入的feature map数量,既能降维减少计算量,又能融合各个通道的特征,何乐而不为。另外作者为了进一步压缩参数,在每两个dense block之间又增加了1*1的卷积操作。因此在后面的实验对比中,如果你看到DenseNet-C这个网络,表示增加了这个Translation layer,该层的1*1卷积的输出channel默认是输入channel的一半。如果你看到DenseNet-BC这个网络,表示既有bottleneck layer,又有Translation layer。
再详细说下bottleneck和transition layer操作。在每个Dense Block中都包含很多个子结构,以DenseNet-169的Dense Block(3)为例,包含32个1*1和3*3的卷积操作,也就是第32个子结构的输入是前面31层的输出结果,每层输出的channel是32(growth rate),那么如果不做bottleneck操作,第32层的3*3卷积操作的输入就是31*32+(上一个Dense Block的输出channel),近1000了。而加上1*1的卷积,代码中的1*1卷积的channel是growth rate*4,也就是128,然后再作为3*3卷积的输入。这就大大减少了计算量,这就是bottleneck。至于transition layer,放在两个Dense Block中间,是因为每个Dense Block结束后的输出channel个数很多,需要用1*1的卷积核来降维。还是以DenseNet-169的Dense Block(3)为例,虽然第32层的3*3卷积输出channel只有32个(growth rate),但是紧接着还会像前面几层一样有通道的concat操作,即将第32层的输出和第32层的输入做concat,前面说过第32层的输入是1000左右的channel,所以最后每个Dense Block的输出也是1000多的channel。因此这个transition layer有个参数reduction(范围是0到1),表示将这些输出缩小到原来的多少倍,默认是0.5,这样传给下一个Dense Block的时候channel数量就会减少一半,这就是transition layer的作用。文中还用到dropout操作来随机减少分支,避免过拟合,毕竟这篇文章的连接确实多。
总结
这篇文章听说当时就引起了轰动,后来又被选为CVPR2017的oral,感觉要撼动ResNet的地位了,再加上现在很多分类检测的网络都是在ResNet上做的,这岂不是大地震了。惊讶之余来总结下这篇文章,该文章提出的DenseNet核心思想在于建立了不同层之间的连接关系,充分利用了feature,进一步减轻了梯度消失问题,加深网络不是问题,而且训练效果非常好。另外,利用bottleneck layer,Translation layer以及较小的growth rate使得网络变窄,参数减少,有效抑制了过拟合,同时计算量也减少了。DenseNet优点很多,而且在和ResNet的对比中优势还是非常明显的。
总结
(1)LeNet:元老级框架,结构简单,却开创了卷积神经网络的新纪元,具有重要的学习价值。
(2) AlexNet:打开了深度学习的大门,深度学习成为学术界的新宠。主要意义在于验证了神经网络的有效性,为后续的发展提供了参考。
(3)ZF-Net:这个在Alex上改进较少,主要贡献是2点:
a)由AlexNet的双GPU改为单GPU上训练;
b)对神经网络的每一层都进行了可视化,这是最主要的贡献。
(4)VGG-Net:在AlexNet的基础上,提出了更深的网络,分别为VGG-16和VGG-19,参数是AlexNet的三倍,为后面的框架提供了方向:加深网络的深度。
(5)GoogLeNet:有四个版本,主要是在网络宽度上进行了改进,不像VGG-Net只是单纯增加深度,在同一层中使用了多个不同尺寸的卷积,以获得不同的视野,最后级联(直接叠加通道数量),这就是Inception module从v2开始,进一步简化把Inception module中的n×n模块分解为1×n和n×1的组合,减少了参数数量,v3进一步把最开始的7×7卷积和其他非3×3进行分解,v4引入了ResNet残差的思想。
(6)ResNet:首次提出了残差的思想(跨层连接,即),解决了网络过深而导致的梯度消失的问题,为更深的网络提供了有力的方向。注意:
a)此处的跨层连接的计算方式和GoogLeNet中的级联不同,这里是每个通道进行相加操作,如果的通道数和的通道数不同,则对用1×1的卷积操作,使得维度一样;
b)有有两个版本v1和v2,v2只是引入了BN(banch normalization),并讨论的BN放置位置的问题,其他思想一样。
(7)DenseNet:比ResNet来的更加彻底,即当前的每一层都和前面的每一层连接。这里有两点值得注意:
a)为了解决每个输入的尺寸不一样的问题,因此提出了Dense block,即在这个模块中才进行每一层的连接,这样便于控制输入尺寸的大小,Dense block模块之间就可以放心的使用池化操作了;
b)此处的连接的计算方式为级联(直接叠加通道数量),和GoogLeNet一样,和ResNet不同。
(8)ResNeXt:在ResNet的基础上,借鉴GoogLeNet的思想,增加了网络的宽度,同时,为了简化设计的复杂度,不像Inception module里面采用了不同尺寸的卷积,这里使用相同的的卷积,并用了32个,最后每个通道相加,和Inception module的级联不同。
(9)DPN:一种双通道网络,结合了ResNet和DenseNet的优点,具有一定的参考价值。
参考:【重磅】计算机视觉和 CNN 发展十一座里程碑(附论文下载)
卷积神经网络超详细介绍_呆呆的猫的博客-CSDN博客_卷积神经网络
【如果对您有帮助,交个朋友给个一键三连吧,您的肯定是我博客高质量维护的动力!!!】
经典CNN卷积神经网络发展史相关推荐
- 经典CNN卷积神经网络发展史+论文+网络实现(PyTorch)
网络搭建目录: Lenet 学习笔记 pytorch官方demo代码复现_放风筝的猪的博客-CSDN博客 AlexNet网络结构详解与代码复现_放风筝的猪的博客-CSDN博客 VGG网络结构详解与代码 ...
- DL之CNN:关于CNN(卷积神经网络)经典论文原文(1950~2018)简介总结框架结构图(非常有价值)之持续更新(吐血整理)
DL之CNN:关于CNN(卷积神经网络)经典论文原文(1950~2018)简介总结框架结构图(非常有价值)之持续更新(吐血整理) 导读 关于CNN,迄今为止已经提出了各种网络结构.其中特别 ...
- DL之CNN(paper):关于CNN(卷积神经网络)经典论文原文(1950~2018)简介、下载地址大全(非常有价值)之持续更新(吐血整理)
DL之CNN(paper):关于CNN(卷积神经网络)经典论文原文(1950~2018)简介.下载地址大全(非常有价值)之持续更新(吐血整理) 导读 关于CNN,迄今为止已经提出了各种网络 ...
- matlab实现cnn代码,CNN 经典的卷积神经网络MATLAB实现源码,可直接运行。 276万源代码下载- www.pudn.com...
文件名称: CNN下载 收藏√ [ 5 4 3 2 1 ] 开发工具: matlab 文件大小: 47017 KB 上传时间: 2016-11-03 下载次数: 93 提 供 者: 郝永达 ...
- CNN---用于图像分类的经典的卷积神经网络CNN
文章目录 概览 1.计算机视觉简介: 2.图像分类 一.LeNet-5 1.模型架构 2.模型简介 3.模型特点 二.AlexNet 1.网络架构 2.模型介绍 3.模型特点 三.VGGNet 1.模 ...
- DeepLearning tutorial(4)CNN卷积神经网络原理简介+代码详解
FROM: http://blog.csdn.net/u012162613/article/details/43225445 DeepLearning tutorial(4)CNN卷积神经网络原理简介 ...
- Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现
Deep Learning论文笔记之(四)CNN卷积神经网络推导和实现 zouxy09@qq.com http://blog.csdn.net/zouxy09 自己平时看了一些论文, ...
- 经典的卷积神经网络简介
引言 本文主要用于对7个经典卷积神经网络的初识,大致了解各个网络提出的背景,以及各自对卷积神经网络发展的作用(即网络的特点). 经典的卷积神经网络: LeNet AlexNet ZF Net VGG ...
- TensorFlow 2.0 mnist手写数字识别(CNN卷积神经网络)
TensorFlow 2.0 (五) - mnist手写数字识别(CNN卷积神经网络) 源代码/数据集已上传到 Github - tensorflow-tutorial-samples 大白话讲解卷积 ...
最新文章
- vue vuex vue-router后台项目——权限路由(超详细简单版)
- UIBubbleTableView
- 游戏中的人工智能(AI)和行为树科普
- 一个故事讲清楚 NIO
- HDFS的读/写流程
- 2020年A股IPO市场全景回顾与2021年前景展望报告
- JWT token信息保存
- UML及UML如何描述复杂系统的开发模型?
- Tomas Mikolov's Recurrent Neural Networks Language Modeling Toolkit
- Struts第八篇【资源国际化、对比JSP的资源国际化】
- fpga电平约束有什么作用_FPGA开发全攻略——时序约束
- 速腾(RoboSense)16线激光雷达调试出点云图(Ubuntu1804和windows系统都已经显示点云),包含各种遇见的坑【避坑指南】{[driver][socket]Rslidar poll}
- Little VGL + code::blocks + 模拟器
- 正则十八式-第三式:龙跃于渊
- 上海东方美谷JW万豪、福清喜来登、宁波杭州湾凯悦等酒店开业 | 中国酒店周刊...
- Android 图片控件ImageView
- 12个面向前端开发者真正有用的 VSCode 插件工具
- CentOS7上安装Snipe-IT4.6.3详细过程及注意事项
- HDU:2026 首字母变大写
- 请问mysql数据类型是否区分大小写?
热门文章
- 岛屿数量JAVA_LeetCode刷题 463. Island Perimeter 岛屿的周长 Java
- 有关秩的等式和不等式
- 2013年网站内容建设新趋势
- C:勇敢羊羊不怕困难!2022-2023年度第四届全国大学生算法设计与编程挑战赛(秋季赛)之羊驼
- Google AppSheet: 无需编程构建零代码应用
- 图文详解!10大高性能开发核心技术+
- 如何向centos服务器传文件,【实用】如何快速实现Windows和CentOS文件互传
- GitLab之something went wrong during merge pre-receive hook问题
- windows C 盘扩容
- Mysql 索引 与 多表查询性能优化