文章目录
- 0️⃣LeNet5
- 🏵LeNet-5的训练算法
- 🏵卷积神经网络的优点
- 🏵总结
- 1️⃣AlexNet
- 🏵特点
- 🏵代码
- 🏵主要贡献
- 🌺ReLU激活函数的引入
- 🌺层叠池化操作
- 🌺Dropout操作
- 🌺网络层数的增加
- 2️⃣VGGNet(Visual Geometry Group)
- 🏵要点
- 3️⃣Google Inception Net
- 🏵1x1卷积的作用
- 🏵要点
- 4️⃣ResNet
- 🏵要点
- 5️⃣ResNeXt
- 🏵网络结构
- 6️⃣SENet
- 🏵SE Block设计
- 7️⃣基于区域的CNNs (R-CNN - 2013, Fast R-CNN - 2015, Faster R-CNN - 2015)
- 🏵RCNN
- 🏵Fast R-CNN
- 🏵Faster R-CNN
- Inference
0️⃣LeNet5
论文:http://yann.lecun.com/exdb/publis/pdf/lecun-01a.pdf
LeNet-5:是Yann LeCun在1998年设计的用于手写数字识别的卷积神经网络,当年美国大多数银行就是用它来识别支票上面的手写数字的,它是早期卷积神经网络中最有代表性的实验系统之一。
LenNet-5共有7层(不包括输入层),每层都包含不同数量的训练参数,如下图所示。
LeNet-5中主要有2个卷积层、2个下抽样层(池化层)、3个全连接层3种连接方式
🏵LeNet-5的训练算法
训练算法与传统的BP算法差不多。主要包括4步,这4步被分为两个阶段:
第一阶段,向前传播阶段:
a)从样本集中取一个样本(X,Yp),将X输入网络;
b)计算相应的实际输出Op。
在此阶段,信息从输入层经过逐级的变换,传送到输出 层。这个过程也是网络在完成训练后正常运行时执行的过程。在此过程中,网络执行的是计算(实际上就是输入与每层的权值矩阵相点乘,得到最后的输出结果):
Op=Fn(…(F2(F1(XpW(1))W(2))…)W(n))
第二阶段,向后传播阶段
a)算实际输出Op与相应的理想输出Yp的差;
b)按极小化误差的方法反向传播调整权矩阵。
🏵卷积神经网络的优点
卷积网络较一般神经网络在图像处理方面有 如下优点
a)输入图像和网络的拓扑结构能很好的吻合;
b)特征提取和模式分类同时进行,并同时在训练中产生;
c)权重共享可以减少网络的训练参数,使神经网络结构变得更简单,适应性更强。
🏵总结
卷积网络在本质上是一种输入到输出的映射,它能够学习大量的输入与输出之间的映射关系,而不需要任何输入和输出之间的精确的数学表达式。
通过对LeNet-5的网络结构的分析,可以直观地了解一个卷积神经网络的构建方法,可以为分析、构建更复杂、更多层的卷积神经网络做准备。
LaNet-5的局限性
CNN能够得出原始图像的有效表征,这使得CNN能够直接从原始像素中,经过极少的预处理,识别视觉上面的规律。然而,由于当时缺乏大规模训练数据,计算机的计算能力也跟不上,LeNet-5 对于复杂问题的处理结果并不理想。
1️⃣AlexNet
论文:http://vision.stanford.edu/teaching/cs231b_spring1415/slides/alexnet_tugce_kyunghee.pdf
AlexNet于2012年由Alex Krizhevsky, Ilya Sutskever 和 Geoffrey Hinton等人提出,并在2012 ILSVRC (ImageNet Large-Scale Visual Recognition Challenge)中取得了最佳的成绩。这也是第一次CNN取得这么好的成绩,并且把第二名远远地甩在了后面,因此震惊了整个领域,从此CNNs才开始被大众所熟知。
这里简单地说一下这个ILSVRC,它是一个ImageNet发起的挑战,是计算机视觉领域的奥运会。全世界的团队带着他们的模型来对ImageNet中的数以千万的共1000个类别的图片进行分类、定位、识别。这个是一个相当有难度的工作,1000个类别啊。
那我们来看看这个AlexNet的结构把:
🏵特点
关于AlexNet有如下要点:
1、在ImageNet数据上对网络进行了培训,该数据包含来自22,000多个类别的超过1500万个带注释的图像。
2、使用ReLU进行非线性函数(发现减少训练时间,因为ReLU比传统的tanh函数快几倍)。
3、使用的数据增强技术包括图像转换,水平反射和补丁提取。
4、实施了dropout层,以解决过度拟合训练数据的问题。
5、使用mini-batch SGD训练模型,具有动量和重量衰减的特定值。
6、在两个GTX 580 GPU上训练五到六天。
7、每一层权重均初始化为0均值0.01标准差的高斯分布,在第二层、第四层和第五层卷积的偏置被设置为1.0,而其他层的则为0,目的是为了加速早期学习的速率(因为激活函数是ReLU,1.0的偏置可以让大部分输出为正)。
8、学习速率初始值为0.01,在训练结束前共减小3次,每次减小都出现在错误率停止减少的时候,每次减小都是把学习速率除以10 。
9、局部响应归一化。在使用饱和型的激活函数时,通常需要对输入进行归一化处理,以利用激活函数在0附近的线性特性与非线性特性,并避免饱和,但对于ReLU函数,不需要输入归一化。然而,Alex等人发现通过LRN这种归一化方式可以帮助提高网络的泛化性能。LRN的作用就是,对位置(x, y)处的像素计算其与几个相邻的kernel maps的像素值的和,并除以这个和来归一化。
🏵代码
import time
import torch
from torch import nn, optim
import torchvision
device = torch.device('cuda' if torch.cuda.is_available() else 'cpu')
class AlexNet(nn.Module):
def __init__(self, num_classes=1000):
super(AlexNet, self).__init__()
self.conv = nn.Sequential(
# 卷积层C1
nn.Conv2d(3, 96, 11, 4),
nn.ReLU(),
nn.MaxPool2d(3, 2),
# 卷积层C2
nn.Conv2d(96, 256, 5, 1, 2),
nn.ReLU(),
nn.MaxPool2d(3, 2),
# 卷积层C3
nn.Conv2d(256, 384, 3, 1, 1),
nn.ReLU(),
# 卷积层C4
nn.Conv2d(384, 384, 3, 1, 1),
nn.ReLU(),
# 卷积层C5
nn.Conv2d(384, 256, 3, 1, 1),
nn.ReLU(),
nn.MaxPool2d(3, 2)
)
self.avgpool = nn.AdaptiveAvgPool2d((6, 6)) # [b,256,6,6], 为了使输出特征图大小为6x6,自动求一个合适的核大小
self.fc = nn.Sequential(
# 全连接层FC6
nn.Dropout(),
nn.Linear(256*6*6, 4096),
nn.ReLU(inplace=True),
# 全连接层FC7
nn.Dropout(0.5),
nn.Linear(4096, 4096),
nn.ReLU(),
# 全连接层FC8
nn.Linear(4096, num_classes),
)
def forward(self, img):
feature = self.conv(img)
feature = self.avgpool(feature) # torch.Size([b, 256, 6, 6])
output = self.fc(feature.view(img.shape[0], -1)) # torch.Size([1, 1000])
return output
🏵主要贡献
🌺ReLU激活函数的引入
采用修正线性单元(ReLU)的深度卷积神经网络训练时间比等价的tanh单元要快几倍。而时间开销是进行模型训练过程中很重要的考量因素之一。同时,ReLU有效防止了过拟合现象的出现。由于ReLU激活函数的高效性与实用性,使得它在深度学习框架中占有重要地位。
🌺层叠池化操作
以往池化的大小PoolingSize与步长stride一般是相等的,例如:图像大小为256*256,PoolingSize=2×2,stride=2,这样可以使图像或是FeatureMap大小缩小一倍变为128,此时池化过程没有发生层叠。但是AlexNet采用了层叠池化操作,即PoolingSize > stride。这种操作非常像卷积操作,可以使相邻像素间产生信息交互和保留必要的联系。论文中也证明,此操作可以有效防止过拟合的发生。
🌺Dropout操作
Dropout操作会将概率小于0.5的每个隐层神经元的输出设为0,即去掉了一些神经节点,达到防止过拟合。那些“失活的”神经元不再进行前向传播并且不参与反向传播。这个技术减少了复杂的神经元之间的相互影响。在论文中,也验证了此方法的有效性。
🌺网络层数的增加
与原始的LeNet相比,AlexNet网络结构更深,LeNet为5层,AlexNet为8层。在随后的神经网络发展过程中,AlexNet逐渐让研究人员认识到网络深度对性能的巨大影响。当然,这种思考的重要节点出现在VGG网络(下文中将会讲到),但是很显然从AlexNet为起点就已经开始了这项工作。
2️⃣VGGNet(Visual Geometry Group)
论文:https://arxiv.org/pdf/1409.1556.pdf
这个网络于2014年被牛津大学的Karen Simonyan 和Andrew Zisserman提出,主要特点是 “简洁,深度”。 深, 是因为VGG有19层,远远超过了它的前辈; 而简洁,则是在于它的结构上,一律采用stride为1的3×3filter,以及stride为2的2×2MaxPooling。所以虽然深,但是结构大家一眼就可以记住。
VggNet一共有六种不同的网络结构,但是每种结构都有含有5组卷积,每组卷积都使用3x3的卷积核,每组卷积后进行一个2x2最大池化,接下来是三个全连接层.在训练高级别的网络时,可以先训练低级别的网络,用前者获得的权重初始化高级别的网络,可以加速网络的收敛.
图下所示,其中,网络结构D就是著名的VGG16,网络结构E就是著名的VGG19。
VGGNet在训练时有一个小技巧,先训练级别A的简单网络,再复用A网络的权重来初始化后面的几个复杂模型,这样训练收敛的速度更快。在预测时,VGG采用Multi-Scale的方法,将图像scale到一个尺寸Q,并将图片输入卷积网络计算。然后在最后一个卷积层使用滑窗的方式进行分类预测,将不同窗口的分类结果平均,再将不同尺寸Q的结果平均得到最后结果,这样可提高图片数据的利用率并提升预测准确率。在训练中,VGGNet还使用了Multi-Scale的方法做数据增强,将原始图像缩放到不同尺寸S,然后再随机裁切224´224的图片,这样能增加很多数据量,对于防止模型过拟合有很不错的效果。
在训练的过程中,比AlexNet收敛的要快一些,原因为:
- 使用小卷积核和更深的网络进行的正则化;
- 在特定的层使用了预训练得到的数据进行参数的初始化。
🏵要点
1、仅使用3x3尺寸的filter与AlexNet的第一层11x11 filter 和ZF Net的7x7 filter 完全不同。作者的推理是两个3x3 conv层的组合具有5x5的有效感受野。这又可以模拟更大的 filter,同时保持较小filter尺寸的优势。其中一个好处是减少了参数的数量。此外,使用两个转换层,我们可以使用两个ReLU层而不是一个。
2、3个背对背的conv层具有7x7的有效感受区域。
3、随着每层输入卷的空间大小减小(转换层和池层的结果),当您沿着网络向下时,由于filter数量的增加,卷的深度会增加。
4、有趣的是注意到每个maxpool层之后过滤器的数量翻倍。这加强了缩小空间尺寸的想法,但增加了深度。
5、在图像分类和本地化任务方面都做得很好。作者使用一种本地化形式作为回归。
6、使用Caffe工具箱构建模型。
7、在训练期间使用scale jittering比例抖动作为一种数据增强技术。
8、在每个转换层之后使用ReLU层并使用批量梯度下降进行训练。
9、在4个Nvidia Titan Black GPU上训练了两到三周。
10、LRN层作用不大(VGGNet不使用局部响应标准化(LRN),这种标准化并不能在ILSVRC数据集上提升性能,却导致更多的内存消耗和计算时间。
3️⃣Google Inception Net
论文:https://www.cs.unc.edu/~wliu/papers/GoogLeNet.pdf
inception(也称GoogLeNet)是2014年Christian Szegedy提出的一种全新的深度学习结构,在这之前的AlexNet、VGG等结构都是通过增大网络的深度(层数)来获得更好的训练效果,但层数的增加会带来很多负作用,比如overfit、梯度消失、梯度爆炸等。inception的提出则从另一种角度来提升训练结果:能更高效的利用计算资源,在相同的计算量下能提取到更多的特征,从而提升训练结果。
🏵1x1卷积的作用
可以看到图1中有多个黄色的1x1卷积模块,这样的卷积有什么用处呢?
作用1:在相同尺寸的感受野中叠加更多的卷积,能提取到更丰富的特征。这个观点来自于Network in Network(NIN, https://arxiv.org/pdf/1312.4400.pdf),上图里三个1x1卷积都起到了该作用。
图2:线性卷积和NIN结构对比
图2左侧是是传统的卷积层结构(线性卷积),在一个尺度上只有一次卷积;右图是Network in Network结构(NIN结构),先进行一次普通的卷积(比如3x3),紧跟再进行一次1x1的卷积,对于某个像素点来说1x1卷积等效于该像素点在所有特征上进行一次全连接的计算,所以右侧图的1x1卷积画成了全连接层的形式,需要注意的是NIN结构中无论是第一个3x3卷积还是新增的1x1卷积,后面都紧跟着激活函数(比如relu)。将两个卷积串联,就能组合出更多的非线性特征。举个例子,假设第1个3x3卷积+激活函数近似于f1(x)=ax2+bx+c,第二个1x1卷积+激活函数近似于f2(x)=mx2+nx+q,那f1(x)和f2(f1(x))比哪个非线性更强,更能模拟非线性的特征?答案是显而易见的。NIN的结构和传统的神经网络中多层的结构有些类似,后者的多层是跨越了不同尺寸的感受野(通过层与层中间加pool层),从而在更高尺度上提取出特征;NIN结构是在同一个尺度上的多层(中间没有pool层),从而在相同的感受野范围能提取更强的非线性。
作用2:使用1x1卷积进行降维,降低了计算复杂度。图2中间3x3卷积和5x5卷积前的1x1卷积都起到了这个作用。当某个卷积层输入的特征数较多,对这个输入进行卷积运算将产生巨大的计算量;如果对输入先进行降维,减少特征数后再做卷积计算量就会显著减少。下图是优化前后两种方案的乘法次数比较,同样是输入一组有192个特征、32x32大小,输出256组特征的数据,第一张图直接用3x3卷积实现,需要192x256x3x3x32x32=452984832次乘法;第二张图先用1x1的卷积降到96个特征,再用3x3卷积恢复出256组特征,需要192x96x1x1x32x32+96x256x3x3x32x32=245366784次乘法,使用1x1卷积降维的方法节省了一半的计算量。有人会问,用1x1卷积降到96个特征后特征数不就减少了么,会影响最后训练的效果么?答案是否定的,只要最后输出的特征数不变(256组),中间的降维类似于压缩的效果,并不影响最终训练的结果。
🏵要点
1、在整个架构中使用了9个Inception模块,总共超过100层!现在这很深…
2、没有使用完全连接的层!他们使用平均水池,从7x7x1024 volume到1x1x1024 volume。这节省了大量参数。
3、使用的参数比AlexNet少12倍。
4、在测试过程中,创建了相同图像的多个作物,并将其输入网络,并对softmax概率进行平均,以便为我们提供最终解决方案。
5、利用R-CNN的概念来检测它们的检测模型。
6、Inception模块有更新版本(版本6和7)。
7、接受“一周内几个高端GPU”的训练。
4️⃣ResNet
论文:https://arxiv.org/pdf/1512.03385.pdf
最后要介绍的就是ResNet,于2015年由微软亚洲研究院的学者们提出。
前面讲了,CNN面临的一个问题就是,随着层数的增加,CNN的效果会遇到瓶颈,甚至会不增反降。这往往是梯度爆炸或者梯度消失引起的。
ResNet就是为了解决这个问题而提出的,因而帮助我们训练更深的网络。 它引入了一个 residual block(残差块):
想要了解更多,欢迎查看我的另外一篇文章
🏵要点
1、152层,“超深”
2、有趣的是,在仅前两层之后,空间大小从224x224的输入体积压缩到56x56体积。
3、作者声称,普通网中层数的单纯增加会导致更高的训练和测试误差。
4、该小组尝试了1202层网络,但测试精度较低,可能是由于过度拟合。
5、在8 GPU机器上训练两到三周。
6、ResNet模型是我们目前拥有的最佳CNN架构,是残差学习理念的重大创新。
5️⃣ResNeXt
- CVPR 2016,ILSVRC 2016的top-2解法,改进了ResNet,top-5错误率5.3%
- 研究了基数对CNN性能的影响,其实就是对普通卷积做分组的分组数量,它是深度和宽度维度之外的一个重要因素
- 想到了Xception(CVPR 2017),它是普通卷积的分组数的极限情况,性能也比Inception要好,当时作者就说,他认为最好的情况不一定是极限,可能是其中的某一种分组情况,正好和本文对上了
a是ResNeXt基本单元,如果把输出那里的1x1合并到一起,得到等价网络b拥有和Inception-ResNet相似的结构,而进一步把输入的1x1也合并到一起,得到等价网络c则和通道分组卷积的网络有相似的结构。
到这里,可以看到本文的野心很大,相当于在说,Inception-ResNet和通道分组卷积网络,都只是ResNeXt这一范式的特殊形式而已,进一步说明了split-transform-merge的普遍性和有效性,以及抽象程度更高,更本质一点。
🏵网络结构
6️⃣SENet
- CVPR 2018,ILSVRC 2017的top-1解法,top-5错误率2.251%,领先第二近25%
- 引入通道注意力机制,对通道进行加权,这不是引入一个新的空间维度来进行特征通道间的融合,而是采用了一种全新的“特征重标定”策略
- 即插即用,引入的参数量较小,但是提升巨大
🏵SE Block设计
基于即插即用,论文给出下面两种结构(Inception 和 ResNet)
实验都基于ImageNet dataset(with 8 GPUs),backbone为ResNet-50。实验表明,降维比例r取16、Squeeze算子采用平均值池化、Excitation算子使用 Sigmoid 、与残差跳接并行和全局采用SE Block下,性能最好。
7️⃣基于区域的CNNs (R-CNN - 2013, Fast R-CNN - 2015, Faster R-CNN - 2015)
🏵RCNN
R-CNN的目的是解决物体检测问题。给定某个图像,我们希望能够在所有对象上绘制边界框。该过程可以分为两个通用组件,即区域建议步骤和分类步骤。
作者指出,任何类别不可知区域提案方法都应该适合。选择性搜索特别用于RCNN。选择性搜索执行生成具有包含对象的概率最高的2000个不同区域的功能。在我们提出一组区域提议之后,这些提议然后被“扭曲”成图像大小,该图像大小可以被馈送到训练有素的CNN(在这种情况下为AlexNet),其为每个区域提取特征向量。然后将该向量用作一组线性SVM的输入,这些线性SVM针对每个类进行训练并输出分类。矢量也被送入边界框回归器以获得最准确的坐标。
🏵Fast R-CNN
由于3个主要问题,对原始模型进行了改进。 训练需要多个阶段(将SVM转换为边界框回归器),计算成本很高,而且速度极慢(RCNN每张图像需要53秒)。 快速R-CNN能够通过基本上共享不同提议之间的转换层的计算并交换生成区域提议和运行CNN的顺序来解决速度问题。 在这个模型中,图像首先通过ConvNet提供,区域提议的特征是从ConvNet的最后一个特征图获得的,最后我们还有完全连接的图层。 作为我们的回归和分类头。
🏵Faster R-CNN
更快的R-CNN可以抗衡R-CNN和快速R-CNN展示出来的的有些复杂的训练管道。 作者在最后一个卷积层之后插入区域提议网络(RPN)。 该网络只能查看最后一个卷积特征图并从中生成区域提议。 从该阶段开始,使用与R-CNN相同的管道(ROI池,FC,然后是分类和回归头)。
Inference