‘壹’ 深度学习之卷积神经网络经典模型
LeNet-5模型 在CNN的应用中,文字识别系统所用的LeNet-5模型是非常经典的模型。LeNet-5模型是1998年,Yann LeCun教授提出的,它是第一个成功大规模应用在手写数字识别问题的卷积神经网络,在MNIST数据集中的正确率可以高达99.2%。
下面详细介绍一下LeNet-5模型工作的原理。
LeNet-5模型一共有7层,每层包含众多参数,也就是卷积神经网络中的参数。虽然层数只有7层,这在如今庞大的神经网络中可是说是非常少的了,但是包含了卷积层,池化层,全连接层,可谓麻雀虽小五脏俱全了。为了方便,我们把卷积层称为C层,下采样层叫做下采样层。
首先,输入层输入原始图像,原始图像被处理成32×32个像素点的值。然后,后面的隐层计在卷积和子抽样之间交替进行。C1层是卷积层,包含了六个特征图。每个映射也就是28x28个神经元。卷积核可以是5x5的十字形,这28×28个神经元共享卷积核权值参数,通过卷积运算,原始信号特征增强,同时也降低了噪声,当卷积核不同时,提取到图像中的特征不同;C2层是一个池化层,池化层的功能在上文已经介绍过了,它将局部像素值平均化来实现子抽样。
池化层包含了六个特征映射,每个映射的像素值为14x14,这样的池化层非常重要,可以在一定程度上保证网络的特征被提取,同时运算量也大大降低,减少了网络结构过拟合的风险。因为卷积层与池化层是交替出现的,所以隐藏层的第三层又是一个卷积层,第二个卷积层由16个特征映射构成,每个特征映射用于加权和计算的卷积核为10x10的。第四个隐藏层,也就是第二个池化层同样包含16个特征映射,每个特征映射中所用的卷积核是5x5的。第五个隐藏层是用5x5的卷积核进行运算,包含了120个神经元,也是这个网络中卷积运算的最后一层。
之后的第六层便是全连接层,包含了84个特征图。全连接层中对输入进行点积之后加入偏置,然后经过一个激活函数传输给输出层的神经元。最后一层,也就是第七层,为了得到输出向量,设置了十个神经元来进行分类,相当于输出一个包含十个元素的一维数组,向量中的十个元素即0到9。
AlexNet模型
AlexNet简介
2012年Imagenet图像识别大赛中,Alext提出的alexnet网络模型一鸣惊人,引爆了神经网络的应用热潮,并且赢得了2012届图像识别大赛的冠军,这也使得卷积神经网络真正意义上成为图像处理上的核心算法。上文介绍的LeNet-5出现在上个世纪,虽然是经典,但是迫于种种复杂的现实场景限制,只能在一些领域应用。不过,随着SVM等手工设计的特征的飞速发展,LeNet-5并没有形成很大的应用状况。随着ReLU与dropout的提出,以及GPU带来算力突破和互联网时代大数据的爆发,卷积神经网络带来历史的突破,AlexNet的提出让深度学习走上人工智能的最前端。
图像预处理
AlexNet的训练数据采用ImageNet的子集中的ILSVRC2010数据集,包含了1000类,共1.2百万的训练图像,50000张验证集,150000张测试集。在进行网络训练之前我们要对数据集图片进行预处理。首先我们要将不同分辨率的图片全部变成256x256规格的图像,变换方法是将图片的短边缩放到 256像素值,然后截取长边的中间位置的256个像素值,得到256x256大小的图像。除了对图片大小进行预处理,还需要对图片减均值,一般图像均是由RGB三原色构成,均值按RGB三分量分别求得,由此可以更加突出图片的特征,更方便后面的计算。
此外,对了保证训练的效果,我们仍需对训练数据进行更为严苛的处理。在256x256大小的图像中,截取227x227大小的图像,在此之后对图片取镜像,这样就使得原始数据增加了(256-224)x(256-224)x2= 2048倍。最后对RGB空间做PCA,然后对主成分做(0,0.1)的高斯扰动,结果使错误率下降1%。对测试数据而言,抽取以图像4个角落的大小为224224的图像,中心的224224大小的图像以及它们的镜像翻转图像,这样便可以获得10张图像,我们便可以利用softmax进行预测,对所有预测取平均作为最终的分类结果。
ReLU激活函数
之前我们提到常用的非线性的激活函数是sigmoid,它能够把输入的连续实值全部确定在0和1之间。但是这带来一个问题,当一个负数的绝对值很大时,那么输出就是0;如果是绝对值非常大的正数,输出就是1。这就会出现饱和的现象,饱和现象中神经元的梯度会变得特别小,这样必然会使得网络的学习更加困难。此外,sigmoid的output的值并不是0为均值,因为这会导致上一层输出的非0均值信号会直接输入到后一层的神经元上。所以AlexNet模型提出了ReLU函数,公式:f(x)=max(0,x)f(x)=max(0,x)。
用ReLU代替了Sigmoid,发现使用 ReLU 得到的SGD的收敛速度会比 sigmoid快很多,这成了AlexNet模型的优势之一。
Dropout
AlexNet模型提出了一个有效的模型组合方式,相比于单模型,只需要多花费一倍的时间,这种方式就做Dropout。在整个神经网络中,随机选取一半的神经元将它们的输出变成0。这种方式使得网络关闭了部分神经元,减少了过拟合现象。同时训练的迭代次数也得以增加。当时一个GTX580 GPU只有3GB内存,这使得大规模的运算成为不可能。但是,随着硬件水平的发展,当时的GPU已经可以实现并行计算了,并行计算之后两块GPU可以互相通信传输数据,这样的方式充分利用了GPU资源,所以模型设计利用两个GPU并行运算,大大提高了运算效率。
模型分析
AlexNet模型共有8层结构,其中前5层为卷积层,其中前两个卷积层和第五个卷积层有池化层,其他卷积层没有。后面3层为全连接层,神经元约有六十五万个,所需要训练的参数约六千万个。
图片预处理过后,进过第一个卷积层C1之后,原始的图像也就变成了55x55的像素大小,此时一共有96个通道。模型分为上下两块是为了方便GPU运算,48作为通道数目更加适合GPU的并行运算。上图的模型里把48层直接变成了一个面,这使得模型看上去更像一个立方体,大小为55x55x48。在后面的第二个卷积层C2中,卷积核的尺寸为5x5x48,由此再次进行卷积运算。在C1,C2卷积层的卷积运算之后,都会有一个池化层,使得提取特征之后的特征图像素值大大减小,方便了运算,也使得特征更加明显。而第三层的卷积层C3又是更加特殊了。第三层卷积层做了通道的合并,将之前两个通道的数据再次合并起来,这是一种串接操作。第三层后,由于串接,通道数变成256。全卷积的卷积核尺寸也就变成了13×13×25613×13×256。一个有4096个这样尺寸的卷积核分别对输入图像做4096次的全卷积操作,最后的结果就是一个列向量,一共有4096个数。这也就是最后的输出,但是AlexNet最终是要分1000个类,所以通过第八层,也就是全连接的第三层,由此得到1000个类输出。
Alexnet网络中各个层发挥了不同的作用,ReLU,多个CPU是为了提高训练速度,重叠pool池化是为了提高精度,且不容易产生过拟合,局部归一化响应是为了提高精度,而数据增益与dropout是为了减少过拟合。
VGG net
在ILSVRC-2014中,牛津大学的视觉几何组提出的VGGNet模型在定位任务第一名和分类任务第一名[[i]]。如今在计算机视觉领域,卷积神经网络的良好效果深得广大开发者的喜欢,并且上文提到的AlexNet模型拥有更好的效果,所以广大从业者学习者试图将其改进以获得更好地效果。而后来很多人经过验证认为,AlexNet模型中所谓的局部归一化响应浪费了计算资源,但是对性能却没有很大的提升。VGG的实质是AlexNet结构的增强版,它侧重强调卷积神经网络设计中的深度。将卷积层的深度提升到了19层,并且在当年的ImageNet大赛中的定位问题中获得了第一名的好成绩。整个网络向人们证明了我们是可以用很小的卷积核取得很好地效果,前提是我们要把网络的层数加深,这也论证了我们要想提高整个神经网络的模型效果,一个较为有效的方法便是将它的深度加深,虽然计算量会大大提高,但是整个复杂度也上升了,更能解决复杂的问题。虽然VGG网络已经诞生好几年了,但是很多其他网络上效果并不是很好地情况下,VGG有时候还能够发挥它的优势,让人有意想不到的收获。
与AlexNet网络非常类似,VGG共有五个卷积层,并且每个卷积层之后都有一个池化层。当时在ImageNet大赛中,作者分别尝试了六种网络结构。这六种结构大致相同,只是层数不同,少则11层,多达19层。网络结构的输入是大小为224*224的RGB图像,最终将分类结果输出。当然,在输入网络时,图片要进行预处理。
VGG网络相比AlexNet网络,在网络的深度以及宽度上做了一定的拓展,具体的卷积运算还是与AlexNet网络类似。我们主要说明一下VGG网络所做的改进。第一点,由于很多研究者发现归一化层的效果并不是很好,而且占用了大量的计算资源,所以在VGG网络中作者取消了归一化层;第二点,VGG网络用了更小的3x3的卷积核,而两个连续的3x3的卷积核相当于5x5的感受野,由此类推,三个3x3的连续的卷积核也就相当于7x7的感受野。这样的变化使得参数量更小,节省了计算资源,将资源留给后面的更深层次的网络。第三点是VGG网络中的池化层特征池化核改为了2x2,而在AlexNet网络中池化核为3x3。这三点改进无疑是使得整个参数运算量下降,这样我们在有限的计算平台上能够获得更多的资源留给更深层的网络。由于层数较多,卷积核比较小,这样使得整个网络的特征提取效果很好。其实由于VGG的层数较多,所以计算量还是相当大的,卷积层比较多成了它最显着的特点。另外,VGG网络的拓展性能比较突出,结构比较简洁,所以它的迁移性能比较好,迁移到其他数据集的时候泛化性能好。到现在为止,VGG网络还经常被用来提出特征。所以当现在很多较新的模型效果不好时,使用VGG可能会解决这些问题。
GoogleNet
谷歌于2014年Imagenet挑战赛(ILSVRC14)凭借GoogleNet再次斩获第一名。这个通过增加了神经网络的深度和宽度获得了更好地效果,在此过程中保证了计算资源的不变。这个网络论证了加大深度,宽度以及训练数据的增加是现有深度学习获得更好效果的主要方式。但是增加尺寸可能会带来过拟合的问题,因为深度与宽度的加深必然会带来过量的参数。此外,增加网络尺寸也带来了对计算资源侵占过多的缺点。为了保证计算资源充分利用的前提下去提高整个模型的性能,作者使用了Inception模型,这个模型在下图中有展示,可以看出这个有点像金字塔的模型在宽度上使用并联的不同大小的卷积核,增加了卷积核的输出宽度。因为使用了较大尺度的卷积核增加了参数。使用了1*1的卷积核就是为了使得参数的数量最少。
Inception模块
上图表格为网络分析图,第一行为卷积层,输入为224×224×3 ,卷积核为7x7,步长为2,padding为3,输出的维度为112×112×64,这里面的7x7卷积使用了 7×1 然后 1×7 的方式,这样便有(7+7)×64×3=2,688个参数。第二行为池化层,卷积核为3×33×3,滑动步长为2,padding为 1 ,输出维度:56×56×64,计算方式:1/2×(112+2×1?3+1)=56。第三行,第四行与第一行,第二行类似。第 5 行 Inception mole中分为4条支线,输入均为上层产生的 28×28×192 结果:第 1 部分,1×1 卷积层,输出大小为28×28×64;第 2 部分,先1×1卷积层,输出大小为28×28×96,作为输入进行3×3卷积层,输出大小为28×28×128;第 3部分,先1×1卷积层,输出大小为28×28×32,作为输入进行3×3卷积层,输出大小为28×28×32;而第3 部分3×3的池化层,输出大小为输出大小为28×28×32。第5行的Inception mole会对上面是个结果的输出结果并联,由此增加网络宽度。
ResNet
2015年ImageNet大赛中,MSRA何凯明团队的ResialNetworks力压群雄,在ImageNet的诸多领域的比赛中上均获得了第一名的好成绩,而且这篇关于ResNet的论文Deep Resial Learning for Image Recognition也获得了CVPR2016的最佳论文,实至而名归。
上文介绍了的VGG以及GoogleNet都是增加了卷积神经网络的深度来获得更好效果,也让人们明白了网络的深度与广度决定了训练的效果。但是,与此同时,宽度与深度加深的同时,效果实际会慢慢变差。也就是说模型的层次加深,错误率提高了。模型的深度加深,以一定的错误率来换取学习能力的增强。但是深层的神经网络模型牺牲了大量的计算资源,学习能力提高的同时不应当产生比浅层神经网络更高的错误率。这个现象的产生主要是因为随着神经网络的层数增加,梯度消失的现象就越来越明显。所以为了解决这个问题,作者提出了一个深度残差网络的结构Resial:
上图就是残差网络的基本结构,可以看出其实是增加了一个恒等映射,将原本的变换函数H(x)转换成了F(x)+x。示意图中可以很明显看出来整个网络的变化,这样网络不再是简单的堆叠结构,这样的话便很好地解决了由于网络层数增加而带来的梯度原来越不明显的问题。所以这时候网络可以做得很深,到目前为止,网络的层数都可以上千层,而能够保证很好地效果。并且,这样的简单叠加并没有给网络增加额外的参数跟计算量,同时也提高了网络训练的效果与效率。
在比赛中,为了证明自己观点是正确的,作者控制变量地设计几个实验。首先作者构建了两个plain网络,这两个网络分别为18层跟34层,随后作者又设计了两个残差网络,层数也是分别为18层和34层。然后对这四个模型进行控制变量的实验观察数据量的变化。下图便是实验结果。实验中,在plain网络上观测到明显的退化现象。实验结果也表明,在残差网络上,34层的效果明显要好于18层的效果,足以证明残差网络随着层数增加性能也是增加的。不仅如此,残差网络的在更深层的结构上收敛性能也有明显的提升,整个实验大为成功。
除此之外,作者还做了关于shortcut方式的实验,如果残差网络模块的输入输出维度不一致,我们如果要使维度统一,必须要对维数较少的进行増维。而增维的最好效果是用0来填充。不过实验数据显示三者差距很小,所以线性投影并不是特别需要。使用0来填充维度同时也保证了模型的复杂度控制在比较低的情况下。
随着实验的深入,作者又提出了更深的残差模块。这种模型减少了各个层的参数量,将资源留给更深层数的模型,在保证复杂度很低的情况下,模型也没有出现梯度消失很明显的情况,因此目前模型最高可达1202层,错误率仍然控制得很低。但是层数如此之多也带来了过拟合的现象,不过诸多研究者仍在改进之中,毕竟此时的ResNet已经相对于其他模型在性能上遥遥领先了。
残差网络的精髓便是shortcut。从一个角度来看,也可以解读为多种路径组合的一个网络。如下图:
ResNet可以做到很深,但是从上图中可以体会到,当网络很深,也就是层数很多时,数据传输的路径其实相对比较固定。我们似乎也可以将其理解为一个多人投票系统,大多数梯度都分布在论文中所谓的effective path上。
DenseNet
在Resnet模型之后,有人试图对ResNet模型进行改进,由此便诞生了ResNeXt模型。
这是对上面介绍的ResNet模型结合了GoogleNet中的inception模块思想,相比于Resnet来说更加有效。随后,诞生了DenseNet模型,它直接将所有的模块连接起来,整个模型更加简单粗暴。稠密相连成了它的主要特点。
我们将DenseNet与ResNet相比较:
从上图中可以看出,相比于ResNet,DenseNet参数量明显减少很多,效果也更加优越,只是DenseNet需要消耗更多的内存。
总结
上面介绍了卷积神经网络发展史上比较着名的一些模型,这些模型非常经典,也各有优势。在算力不断增强的现在,各种新的网络训练的效率以及效果也在逐渐提高。从收敛速度上看,VGG>Inception>DenseNet>ResNet,从泛化能力来看,Inception>DenseNet=ResNet>VGG,从运算量看来,Inception<DenseNet< ResNet<VGG,从内存开销来看,Inception<ResNet< DenseNet<VGG。在本次研究中,我们对各个模型均进行了分析,但从效果来看,ResNet效果是最好的,优于Inception,优于VGG,所以我们第四章实验中主要采用谷歌的Inception模型,也就是GoogleNet。
‘贰’ 神经网络:卷积神经网络(CNN)
神经网络 最早是由心理学家和神经学家提出的,旨在寻求开发和测试神经的计算模拟。
粗略地说, 神经网络 是一组连接的 输入/输出单元 ,其中每个连接都与一个 权 相关联。在学习阶段,通过调整权值,使得神经网络的预测准确性逐步提高。由于单元之间的连接,神经网络学习又称 连接者学习。
神经网络是以模拟人脑神经元的数学模型为基础而建立的,它由一系列神经元组成,单元之间彼此连接。从信息处理角度看,神经元可以看作是一个多输入单输出的信息处理单元,根据神经元的特性和功能,可以把神经元抽象成一个简单的数学模型。
神经网络有三个要素: 拓扑结构、连接方式、学习规则
神经网络的拓扑结构 :神经网络的单元通常按照层次排列,根据网络的层次数,可以将神经网络分为单层神经网络、两层神经网络、三层神经网络等。结构简单的神经网络,在学习时收敛的速度快,但准确度低。
神经网络的层数和每层的单元数由问题的复杂程度而定。问题越复杂,神经网络的层数就越多。例如,两层神经网络常用来解决线性问题,而多层网络就可以解决多元非线性问题
神经网络的连接 :包括层次之间的连接和每一层内部的连接,连接的强度用权来表示。
根据层次之间的连接方式,分为:
1)前馈式网络:连接是单向的,上层单元的输出是下层单元的输入,如反向传播网络,Kohonen网络
2)反馈式网络:除了单项的连接外,还把最后一层单元的输出作为第一层单元的输入,如Hopfield网络
根据连接的范围,分为:
1)全连接神经网络:每个单元和相邻层上的所有单元相连
2)局部连接网络:每个单元只和相邻层上的部分单元相连
神经网络的学习
根据学习方法分:
感知器:有监督的学习方法,训练样本的类别是已知的,并在学习的过程中指导模型的训练
认知器:无监督的学习方法,训练样本类别未知,各单元通过竞争学习。
根据学习时间分:
离线网络:学习过程和使用过程是独立的
在线网络:学习过程和使用过程是同时进行的
根据学习规则分:
相关学习网络:根据连接间的激活水平改变权系数
纠错学习网络:根据输出单元的外部反馈改变权系数
自组织学习网络:对输入进行自适应地学习
摘自《数学之美》对人工神经网络的通俗理解:
神经网络种类很多,常用的有如下四种:
1)Hopfield网络,典型的反馈网络,结构单层,有相同的单元组成
2)反向传播网络,前馈网络,结构多层,采用最小均方差的纠错学习规则,常用于语言识别和分类等问题
3)Kohonen网络:典型的自组织网络,由输入层和输出层构成,全连接
4)ART网络:自组织网络
深度神经网络:
Convolutional Neural Networks(CNN)卷积神经网络
Recurrent neural Network(RNN)循环神经网络
Deep Belief Networks(DBN)深度信念网络
深度学习是指多层神经网络上运用各种机器学习算法解决图像,文本等各种问题的算法集合。深度学习从大类上可以归入神经网络,不过在具体实现上有许多变化。
深度学习的核心是特征学习,旨在通过分层网络获取分层次的特征信息,从而解决以往需要人工设计特征的重要难题。
Machine Learning vs. Deep Learning
神经网络(主要是感知器)经常用于 分类
神经网络的分类知识体现在网络连接上,被隐式地存储在连接的权值中。
神经网络的学习就是通过迭代算法,对权值逐步修改的优化过程,学习的目标就是通过改变权值使训练集的样本都能被正确分类。
神经网络特别适用于下列情况的分类问题:
1) 数据量比较小,缺少足够的样本建立模型
2) 数据的结构难以用传统的统计方法来描述
3) 分类模型难以表示为传统的统计模型
缺点:
1) 需要很长的训练时间,因而对于有足够长训练时间的应用更合适。
2) 需要大量的参数,这些通常主要靠经验确定,如网络拓扑或“结构”。
3) 可解释性差 。该特点使得神经网络在数据挖掘的初期并不看好。
优点:
1) 分类的准确度高
2)并行分布处理能力强
3)分布存储及学习能力高
4)对噪音数据有很强的鲁棒性和容错能力
最流行的基于神经网络的分类算法是80年代提出的 后向传播算法 。后向传播算法在多路前馈神经网络上学习。
定义网络拓扑
在开始训练之前,用户必须说明输入层的单元数、隐藏层数(如果多于一层)、每一隐藏层的单元数和输出层的单元数,以确定网络拓扑。
对训练样本中每个属性的值进行规格化将有助于加快学习过程。通常,对输入值规格化,使得它们落入0.0和1.0之间。
离散值属性可以重新编码,使得每个域值一个输入单元。例如,如果属性A的定义域为(a0,a1,a2),则可以分配三个输入单元表示A。即,我们可以用I0 ,I1 ,I2作为输入单元。每个单元初始化为0。如果A = a0,则I0置为1;如果A = a1,I1置1;如此下去。
一个输出单元可以用来表示两个类(值1代表一个类,而值0代表另一个)。如果多于两个类,则每个类使用一个输出单元。
隐藏层单元数设多少个“最好” ,没有明确的规则。
网络设计是一个实验过程,并可能影响准确性。权的初值也可能影响准确性。如果某个经过训练的网络的准确率太低,则通常需要采用不同的网络拓扑或使用不同的初始权值,重复进行训练。
后向传播算法学习过程:
迭代地处理一组训练样本,将每个样本的网络预测与实际的类标号比较。
每次迭代后,修改权值,使得网络预测和实际类之间的均方差最小。
这种修改“后向”进行。即,由输出层,经由每个隐藏层,到第一个隐藏层(因此称作后向传播)。尽管不能保证,一般地,权将最终收敛,学习过程停止。
算法终止条件:训练集中被正确分类的样本达到一定的比例,或者权系数趋近稳定。
后向传播算法分为如下几步:
1) 初始化权
网络的权通常被初始化为很小的随机数(例如,范围从-1.0到1.0,或从-0.5到0.5)。
每个单元都设有一个偏置(bias),偏置也被初始化为小随机数。
2) 向前传播输入
对于每一个样本X,重复下面两步:
向前传播输入,向后传播误差
计算各层每个单元的输入和输出。输入层:输出=输入=样本X的属性;即,对于单元j,Oj = Ij = Xj。隐藏层和输出层:输入=前一层的输出的线性组合,即,对于单元j, Ij =wij Oi + θj,输出=
3) 向后传播误差
计算各层每个单元的误差。
输出层单元j,误差:
Oj是单元j的实际输出,而Tj是j的真正输出。
隐藏层单元j,误差:
wjk是由j到下一层中单元k的连接的权,Errk是单元k的误差
更新 权 和 偏差 ,以反映传播的误差。
权由下式更新:
其中,△wij是权wij的改变。l是学习率,通常取0和1之间的值。
偏置由下式更新:
其中,△θj是偏置θj的改变。
Example
人类视觉原理:
深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。1981 年的诺贝尔医学奖,颁发给了 David Hubel(出生于加拿大的美国神经生物学家) 和Torsten Wiesel,以及Roger Sperry。前两位的主要贡献,是“发现了视觉系统的信息处理”, 可视皮层是分级的 。
人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。
对于不同的物体,人类视觉也是通过这样逐层分级,来进行认知的:
在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。
可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。
卷积神经网络是一种多层神经网络,擅长处理图像特别是大图像的相关机器学习问题。卷积网络通过一系列方法,成功将数据量庞大的图像识别问题不断降维,最终使其能够被训练。
CNN最早由Yann LeCun提出并应用在手写字体识别上。LeCun提出的网络称为LeNet,其网络结构如下:
这是一个最典型的卷积网络,由 卷积层、池化层、全连接层 组成。其中卷积层与池化层配合,组成多个卷积组,逐层提取特征,最终通过若干个全连接层完成分类。
CNN通过卷积来模拟特征区分,并且通过卷积的权值共享及池化,来降低网络参数的数量级,最后通过传统神经网络完成分类等任务。
降低参数量级:如果使用传统神经网络方式,对一张图片进行分类,那么,把图片的每个像素都连接到隐藏层节点上,对于一张1000x1000像素的图片,如果有1M隐藏层单元,一共有10^12个参数,这显然是不能接受的。
但是在CNN里,可以大大减少参数个数,基于以下两个假设:
1)最底层特征都是局部性的,也就是说,用10x10这样大小的过滤器就能表示边缘等底层特征
2)图像上不同小片段,以及不同图像上的小片段的特征是类似的,也就是说,能用同样的一组分类器来描述各种各样不同的图像
基于以上两个假设,就能把第一层网络结构简化
用100个10x10的小过滤器,就能够描述整幅图片上的底层特征。
卷积运算的定义如下图所示:
如上图所示,一个5x5的图像,用一个3x3的 卷积核 :
101
010
101
来对图像进行卷积操作(可以理解为有一个滑动窗口,把卷积核与对应的图像像素做乘积然后求和),得到了3x3的卷积结果。
这个过程可以理解为使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。在实际训练过程中, 卷积核的值是在学习过程中学到的。
在具体应用中,往往有多个卷积核,可以认为, 每个卷积核代表了一种图像模式 ,如果某个图像块与此卷积核卷积出的值大,则认为此图像块十分接近于此卷积核。如果设计了6个卷积核,可以理解为这个图像上有6种底层纹理模式,也就是用6种基础模式就能描绘出一副图像。以下就是24种不同的卷积核的示例:
池化 的过程如下图所示:
可以看到,原始图片是20x20的,对其进行采样,采样窗口为10x10,最终将其采样成为一个2x2大小的特征图。
之所以这么做,是因为即使做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行采样。
即使减少了许多数据,特征的统计属性仍能够描述图像,而且由于降低了数据维度,有效地避免了过拟合。
在实际应用中,分为最大值采样(Max-Pooling)与平均值采样(Mean-Pooling)。
LeNet网络结构:
注意,上图中S2与C3的连接方式并不是全连接,而是部分连接。最后,通过全连接层C5、F6得到10个输出,对应10个数字的概率。
卷积神经网络的训练过程与传统神经网络类似,也是参照了反向传播算法
第一阶段,向前传播阶段:
a)从样本集中取一个样本(X,Yp),将X输入网络;
b)计算相应的实际输出Op
第二阶段,向后传播阶段
a)计算实际输出Op与相应的理想输出Yp的差;
b)按极小化误差的方法反向传播调整权矩阵。
‘叁’ 卷积神经网络CNN在图像识别问题应用综述(20191219)
这两天在公司做PM实习,主要是自学一些CV的知识,以了解产品在解决一些在图像识别、图像搜索方面的问题,学习的主要方式是在知网检索了6.7篇国内近3年计算机视觉和物体识别的硕博士论文。由于时间关系,后面还会继续更新图片相似度计算(以图搜图)等方面的学习成果
将这两天的学习成果在这里总结一下。你将会看到计算机视觉在解决特定物体识别问题(主要是卷积神经网络CNNs)的基础过程和原理,但这里不会深入到技术的实现层面。
计算机视觉(Computer vision)是一门研究如何使机器“看”的科学,更进一步的说,就是指用摄影机和计算机代替人眼对目标进行识别、跟踪和测量等机器视觉,并进一步做图像处理,用计算机处理成为更适合人眼观察或传送给仪器检测的图像。
————维基网络
通常而言,计算机视觉的研究包括三个层次:
(1)底层特征的研究:
这一层次的研究主要聚焦如何高效提取出图像对象具有判别性能的特征,具体的研究内容通常包括:物体识别、字符识别等
(2)中层语义特征的研究:
该层次的研究在于在识别出对象的基础上,对其位置、边缘等信息能够准确区分。现在比较热门的:图像分割;语义分割;场景标注等,都属于该领域的范畴
(3)高层语义理解:
这一层次建立在前两层的基础上,其核心在于“理解”一词。 目标在于对复杂图像中的各个对象完成语义级别的理解。这一层次的研究常常应用于:场景识别、图像摘要生成及图像语义回答等。
而我研究的问题主要隶属于底层特征和中层语义特征研究中的物体识别和场景标注问题。
人类的视觉工作模式是这样的:
首先,我们大脑中的神经元接收到大量的信息微粒,但我们的大脑还并不能处理它们。
于是接着神经元与神经元之间交互将大量的微粒信息整合成一条又一条的线。
接着,无数条线又整合成一个个轮廓。
最后多个轮廓累加终于聚合我们现在眼前看到的样子。
计算机科学受到神经科学的启发,也采用了类似的工作方式。具体而言,图像识别问题一般都遵循下面几个流程
(1)获取底层信息。获取充分且清洁的高质量数据往往是图像识别工作能否成功的关键所在
(2)数据预处理工作,在图像识别领域主要包括四个方面的技术:去噪处理(提升信噪比)、图像增强和图像修复(主要针对不够清晰或有破损缺失的图像);归一化处理(一方面是为了减少开销、提高算法的性能,另一方面则是为了能成功使用深度学习等算法,这类算法必须使用归一化数据)。
(3)特征提取,这一点是该领域的核心,也是本文的核心。图像识别的基础是能够提取出足够高质量,能体现图像独特性和区分度的特征。
过去在10年代之前我们主要还是更多的使用传统的人工特征提取方法,如PCALCA等来提取一些人工设计的特征,主要的方法有(HOG、LBP以及十分着名的SIFT算法)。但是这些方法普遍存在(a)一般基于图像的一些提层特征信息(如色彩、纹理等)难以表达复杂的图像高层语义,故泛化能力普遍比较弱。(b)这些方法一般都针对特定领域的特定应用设计,泛化能力和迁移的能力大多比较弱。
另外一种思路是使用BP方法,但是毕竟BP方法是一个全连接的神经网络。这以为这我们非常容易发生过拟合问题(每个元素都要负责底层的所有参数),另外也不能根据样本对训练过程进行优化,实在是费时又费力。
因此,一些研究者开始尝试把诸如神经网络、深度学习等方法运用到特征提取的过程中,以十几年前深度学习方法在业界最重要的比赛ImageNet中第一次战胜了SIFT算法为分界线,由于其使用权重共享和特征降采样,充分利用了数据的特征。几乎每次比赛的冠军和主流都被深度学习算法及其各自改进型所占领。其中,目前使用较多又最为主流的是CNN算法,在第四部分主要也研究CNN方法的机理。
上图是一个简易的神经网络,只有一层隐含层,而且是全连接的(如图,上一层的每个节点都要对下一层的每个节点负责。)具体神经元与神经元的作用过程可见下图。
在诸多传统的神经网络中,BP算法可能是性能最好、应用最广泛的算法之一了。其核心思想是:导入训练样本、计算期望值和实际值之间的差值,不断地调整权重,使得误差减少的规定值的范围内。其具体过程如下图:
一般来说,机器学习又分成浅层学习和深度学习。传统的机器学习算法,如SVM、贝叶斯、神经网络等都属于浅层模型,其特点是只有一个隐含层。逻辑简单易懂、但是其存在理论上缺乏深度、训练时间较长、参数很大程度上依赖经验和运气等问题。
如果是有多个隐含层的多层神经网络(一般定义为大于5层),那么我们将把这个模型称为深度学习,其往往也和分层训练配套使用。这也是目前AI最火的领域之一了。如果是浅层模型的问题在于对一个复杂函数的表示能力不够,特别是在复杂问题分类情况上容易出现分类不足的弊端,深度网络的优势则在于其多层的架构可以分层表示逻辑,这样就可以用简单的方法表示出复杂的问题,一个简单的例子是:
如果我们想计算sin(cos(log(exp(x)))),
那么深度学习则可分层表示为exp(x)—>log(x)—>cos(x)—>sin(x)
图像识别问题是物体识别的一个子问题,其鲁棒性往往是解决该类问题一个非常重要的指标,该指标是指分类结果对于传入数据中的一些转化和扭曲具有保持不变的特性。这些转化和扭曲具体主要包括了:
(1)噪音(2)尺度变化(3)旋转(4)光线变化(5)位移
该部分具体的内容,想要快速理解原理的话推荐看[知乎相关文章] ( https://www.hu.com/search?type=content&q=CNN ),
特别是其中有些高赞回答中都有很多动图和动画,非常有助于理解。
但核心而言,CNN的核心优势在于 共享权重 以及 感受野 ,减少了网络的参数,实现了更快的训练速度和同样预测结果下更少的训练样本,而且相对于人工方法,一般使用深度学习实现的CNN算法使用无监督学习,其也不需要手工提取特征。
CNN算法的过程给我的感觉,个人很像一个“擦玻璃”的过程。其技术主要包括了三个特性:局部感知、权重共享和池化。
CNN中的神经元主要分成了两种:
(a)用于特征提取的S元,它们一起组成了卷积层,用于对于图片中的每一个特征首先局部感知。其又包含很关键的阈值参数(控制输出对输入的反映敏感度)和感受野参数(决定了从输入层中提取多大的空间进行输入,可以简单理解为擦玻璃的抹布有多大)
(b)抗形变的C元,它们一起组成了池化层,也被称为欠采样或下采样。主要用于特征降维,压缩数据和参数的数量,减小过拟合,同时提高模型的容错性。
(c*)激活函数,及卷积层输出的结果要经过一次激励函数才会映射到池化层中,主要的激活函数有Sigmoid函数、Tanh函数、ReLU、Leaky ReLU、ELU、Maxout等。
也许你会抱有疑问,CNN算法和传统的BP算法等究竟有什么区别呢。这就会引出区域感受野的概念。在前面我们提到,一个全连接中,较高一层的每个神经元要对低层的每一个神经元负责,从而导致了过拟合和维度灾难的问题。但是有了区域感受野和,每个神经元只需要记录一个小区域,而高层会把这些信息综合起来,从而解决了全连接的问题。
了解区域感受野后,你也许会想,区域感受野的底层神经元具体是怎么聚合信息映射到上一层的神经元呢,这就要提到重要的卷积核的概念。这个过程非常像上面曾提到的“神经元与神经元的联系”一图,下面给大家一个很直观的理解。
上面的这个过程就被称为一个卷积核。在实际应用中,单特征不足以被系统学习分类,因此我们往往会使用多个滤波器,每个滤波器对应1个卷积核,也对应了一个不同的特征。比如:我们现在有一个人脸识别应用,我们使用一个卷积核提取出眼睛的特征,然后使用另一个卷积核提取出鼻子的特征,再用一个卷积核提取出嘴巴的特征,最后高层把这些信息聚合起来,就形成了分辨一个人与另一个人不同的判断特征。
现在我们已经有了区域感受野,也已经了解了卷积核的概念。但你会发现在实际应用中还是有问题:
给一个100 100的参数空间,假设我们的感受野大小是10 10,那么一共有squar(1000-10+1)个,即10的六次方个感受野。每个感受野中就有100个参数特征,及时每个感受野只对应一个卷积核,那么空间内也会有10的八次方个次数,,更何况我们常常使用很多个卷积核。巨大的参数要求我们还需要进一步减少权重参数,这就引出了权重共享的概念。
用一句话概括就是,对同一个特征图,每个感受野的卷积核是一样的,如这样操作后上例只需要100个参数。
池化是CNN技术的最后一个特性,其基本思想是: 一块区域有用的图像特征,在另一块相似的区域中很可能仍然有用。即我们通过卷积得到了大量的边缘EDGE数据,但往往相邻的边缘具有相似的特性,就好像我们已经得到了一个强边缘,再拥有大量相似的次边缘特征其实是没有太大增量价值的,因为这样会使得系统里充斥大量冗余信息消耗计算资源。 具体而言,池化层把语义上相似的特征合并起来,通过池化操作减少卷积层输出的特征向量,减少了参数,缓解了过拟合问题。常见的池化操作主要包括3种:
分别是最大值池化(保留了图像的纹理特征)、均值池化(保留了图像的整体特征)和随机值池化。该技术的弊端是容易过快减小数据尺寸,目前趋势是用其他方法代替池化的作用,比如胶囊网络推荐采用动态路由来代替传统池化方法,原因是池化会带来一定程度上表征的位移不变性,传统观点认为这是一个优势,但是胶囊网络的作者Hinton et al.认为图像中位置信息是应该保留的有价值信息,利用特别的聚类评分算法和动态路由的方式可以学习到更高级且灵活的表征,有望冲破目前卷积网络构架的瓶颈。
CNN总体来说是一种结构,其包含了多种网络模型结构,数目繁多的的网络模型结构决定了数据拟合能力和泛化能力的差异。其中的复杂性对用户的技术能力有较高的要求。此外,CNN仍然没有很好的解决过拟合问题和计算速度较慢的问题。
该部分的核心参考文献:
《深度学习在图像识别中的应用研究综述》郑远攀,李广阳,李晔.[J].计算机工程与应用,2019,55(12):20-36.
深度学习技术在计算机图像识别方面的领域应用研究是目前以及可预见的未来的主流趋势,在这里首先对深度学习的基本概念作一简介,其次对深度学习常用的结构模型进行概述说明,主要简述了深度信念网络(DBN)、卷积神经网络(CNN)、循环神经网络(RNN)、生成式对抗网络(GAN)、胶囊网络(CapsNet)以及对各个深度模型的改进模型做一对比分析。
深度学习按照学习架构可分为生成架构、判别架构及混合架构。
其生成架构模型主要包括:
受限波尔兹曼机、自编码器、深层信念网络等。判别架构模型主要包括:深层前馈网络、卷积神经网络等。混合架构模型则是这两种架构的集合。深度学习按数据是否具有标签可分为非监督学习与监督学习。非监督学习方法主要包括:受限玻尔兹曼机、自动编码器、深层信念网络、深层玻尔兹曼机等。
监督学习方法主要包括:深层感知器、深层前馈网络、卷积神经网络、深层堆叠网络、循环神经网络等。大量实验研究表明,监督学习与非监督学习之间无明确的界限,如:深度信念网络在训练过程中既用到监督学习方法又涉及非监督学习方法。
[1]周彬. 多视图视觉检测关键技术及其应用研究[D].浙江大学,2019.
[2]郑远攀,李广阳,李晔.深度学习在图像识别中的应用研究综述[J].计算机工程与应用,2019,55(12):20-36.
[3]逄淑超. 深度学习在计算机视觉领域的若干关键技术研究[D].吉林大学,2017.
[4]段萌. 基于卷积神经网络的图像识别方法研究[D].郑州大学,2017.
[5]李彦冬. 基于卷积神经网络的计算机视觉关键技术研究[D].电子科技大学,2017.
[6]李卫. 深度学习在图像识别中的研究及应用[D].武汉理工大学,2014.
[7]许可. 卷积神经网络在图像识别上的应用的研究[D].浙江大学,2012.
[8]CSDN、知乎、机器之心、维基网络
‘肆’ 吴恩达 卷积神经网络 CNN
应用计算机视觉时要面临的一个挑战是数据的输入可能会非常大。例如一张 1000x1000x3 的图片,神经网络输入层的维度将高达三百万,使得网络权重 W 非常庞大。这样会造成两个后果:
神经网络结构复杂,数据量相对较少,容易出现过拟合;
所需内存和计算量巨大。
因此,一般的神经网络很难处理蕴含着大量数据的图像。解决这一问题的方法就是使用卷积神经网络
我们之前提到过,神经网络由浅层到深层,分别可以检测出图片的边缘特征、局部特征(例如眼睛、鼻子等),到最后面的一层就可以根据前面检测的特征来识别整体面部轮廓。这些工作都是依托卷积神经网络来实现的。
卷积运算(Convolutional Operation)是卷积神经网络最基本的组成部分。我们以边缘检测为例,来解释卷积是怎样运算的。
图片最常做的边缘检测有两类:垂直边缘(Vertical Edges)检测和水平边缘(Horizontal Edges)检测。
比如检测一张6x6像素的灰度图片的vertical edge,设计一个3x3的矩阵(称之为filter或kernel),让原始图片和filter矩阵做卷积运算(convolution),得到一个4x4的图片。 具体的做法是,将filter矩阵贴到原始矩阵上(从左到右从上到下),依次可以贴出4x4种情况。 让原始矩阵与filter重合的部分做element wise的乘积运算再求和 ,所得的值作为4x4矩阵对应元素的值。如下图是第一个元素的计算方法,以此类推。
可以看到,卷积运算的求解过程是从左到右,由上到下,每次在原始图片矩阵中取与滤波器同等大小的一部分,每一部分中的值与滤波器中的值对应相乘后求和,将结果组成一个矩阵。
下图对应一个垂直边缘检测的例子:
如果将最右边的矩阵当作图像,那么中间一段亮一些的区域对应最左边的图像中间的垂直边缘。
下图3x3滤波器,通常称为垂直 索伯滤波器 (Sobel filter):
看看用它来处理知名的Lena照片会得到什么:
现在可以解释卷积操作的用处了:用输出图像中更亮的像素表示原始图像中存在的边缘。
你能看出为什么边缘检测图像可能比原始图像更有用吗?
回想一下MNIST手写数字分类问题。在MNIST上训练的CNN可以找到某个特定的数字。比如发现数字1,可以通过使用边缘检测发现图像上两个突出的垂直边缘。
通常,卷积有助于我们找到特定的局部图像特征(如边缘),用在后面的网络中。
假设输入图片的大小为 n×n,而滤波器的大小为 f×f,则卷积后的输出图片大小为 (n−f+1)×(n−f+1)。
这样就有两个问题:
为了解决这些问题,可以在进行卷积操作前,对原始图片在边界上进行填充(Padding),以增加矩阵的大小。通常将 0 作为填充值。
设每个方向扩展像素点数量为 p,则填充后原始图片的大小为 (n+2p)×(n+2p),滤波器大小保持 f×f不变,则输出图片大小为 (n+2p−f+1)×(n+2p−f+1)。
因此,在进行卷积运算时,我们有两种选择:
在计算机视觉领域,f通常为奇数。原因包括 Same 卷积中 p=(f−1)/ 2 能得到自然数结果,并且滤波器有一个便于表示其所在位置的中心点。
卷积过程中,有时需要通过填充来避免信息损失,有时也需要通过设置 步长(Stride) 来压缩一部分信息。
步长表示滤波器在原始图片的水平方向和垂直方向上每次移动的距离。之前,步长被默认为 1。而如果我们设置步长为 2,则卷积过程如下图所示:
设步长为 s,填充长度为p, 输入图片大小为n x n, 滤波器大小为f x f, 则卷积后图片的尺寸为:
注意公式中有一个向下取整的符号,用于处理商不为整数的情况。向下取整反映着当取原始矩阵的图示蓝框完全包括在图像内部时,才对它进行运算。
如果我们想要对三通道的 RGB 图片进行卷积运算,那么其对应的滤波器组也同样是三通道的。过程是将每个单通道(R,G,B)与对应的滤波器进行卷积运算求和,然后再将三个通道的和相加,将 27 个乘积的和作为输出图片的一个像素值。
如果想同时检测垂直和水平边缘,或者更多的边缘检测,可以增加更多的滤波器组。例如设置第一个滤波器组实现垂直边缘检测,第二个滤波器组实现水平边缘检测。设输入图片的尺寸为 n×n×nc(nc为通道数),滤波器尺寸为 f×f×nc,则卷积后的输出图片尺寸为 (n−f+1)×(n−f+1)×n′c,n′c为滤波器组的个数。
与之前的卷积过程相比较,卷积神经网络的单层结构多了激活函数和偏移量;而与标准神经网络相比,滤波器的数值对应着权重 W[l],卷积运算对应着 W[l]与 A[l−1]的乘积运算,所选的激活函数变为 ReLU。
对于一个 3x3x3 的滤波器,包括偏移量 b(27+1)在内共有 28 个参数。不论输入的图片有多大,用这一个滤波器来提取特征时,参数始终都是 28 个,固定不变。即选定滤波器组后,参数的数目与输入图片的尺寸无关。因此,卷积神经网络的参数相较于标准神经网络来说要少得多。这是 CNN 的优点之一。
图像中的相邻像素倾向于具有相似的值,因此通常卷积层相邻的输出像素也具有相似的值。这意味着,卷积层输出中包含的大部分信息都是冗余的。如果我们使用边缘检测滤波器并在某个位置找到强边缘,那么我们也可能会在距离这个像素1个偏移的位置找到相对较强的边缘。但是它们都一样是边缘,我们并没有找到任何新东西。池化层解决了这个问题。这个网络层所做的就是通过减小输入的大小降低输出值的数量。池化一般通过简单的最大值、最小值或平均值操作完成。以下是池大小为2的最大池层的示例:
在计算神经网络的层数时,通常只统计具有权重和参数的层,因此池化层通常和之前的卷积层共同计为一层。
图中的 FC3 和 FC4 为全连接层,与标准的神经网络结构一致。
个人推荐 一个直观感受卷积神经网络的网站 。
相比标准神经网络,对于大量的输入数据,卷积过程有效地减少了 CNN 的参数数量,原因有以下两点:
-参数共享(Parameter sharing):特征检测如果适用于图片的某个区域,那么它也可能适用于图片的其他区域。即在卷积过程中,不管输入有多大,一个特征探测器(滤波器)就能对整个输入的某一特征进行探测。
-稀疏连接(Sparsity of connections):在每一层中,由于滤波器的尺寸限制,输入和输出之间的连接是稀疏的,每个输出值只取决于输入在局部的一小部分值。
池化过程则在卷积后很好地聚合了特征,通过降维来减少运算量。
由于 CNN 参数数量较小,所需的训练样本就相对较少,因此在一定程度上不容易发生过拟合现象。并且 CNN 比较擅长捕捉区域位置偏移。即进行物体检测时,不太受物体在图片中位置的影响,增加检测的准确性和系统的健壮性。
在神经网络可以收敛的前提下,随着网络深度增加,网络的表现先是逐渐增加至饱和,然后迅速下降
需要注意,网络退化问题不是过拟合导致的,即便在模型训练过程中,同样的训练轮次下,退化的网络也比稍浅层的网络的训练错误更高,如下图所示。
这一点并不符合常理:如果存在某个 K层网络是当前F的最优的网络,我们构造更深的网络。那么K之后的层数可以拟合成恒等映射,就可以取得和F一直的结果。如果K不是最佳层数,那么我们比K深,可以训练出的一定会不差于K的。总而言之,与浅层网络相比,更深的网络的表现不应该更差。因此,一个合理的猜测就是, 对神经网络来说,恒等映射并不容易拟合。
也许我们可以对网络单元进行一定的改造,来改善退化问题?这也就引出了残差网络的基本思路
既然神经网络不容易拟合一个恒等映射,那么一种思路就是构造天然的恒等映射。
实验表明,残差网络 很好地解决了深度神经网络的退化问题 ,并在ImageNet和CIFAR-10等图像任务上取得了非常好的结果,同等层数的前提下残差网络也 收敛得更快 。这使得前馈神经网络可以采用更深的设计。除此之外, 去除个别神经网络层,残差网络的表现不会受到显着影响 ,这与传统的前馈神经网络大相径庭。
2018年的一篇论文,The Shattered Gradients Problem: If resnets are the answer, then what is the question,指出了一个新的观点,尽管残差网络提出是为了解决梯度弥散和网络退化的问题, 它解决的实际上是梯度破碎问题
作者通过可视化的小型实验(构建和训练一个神经网络发现,在浅层神经网络中,梯度呈现为棕色噪声(brown noise),深层神经网络的梯度呈现为白噪声。在标准前馈神经网络中,随着深度增加, 神经元梯度的相关性(corelation)按指数级减少 (1 / 2^L) ;同时, 梯度的空间结构也随着深度增加被逐渐消除 。这也就是梯度破碎现象。
梯度破碎为什么是一个问题呢?这是因为许多优化方法假设梯度在相邻点上是相似的,破碎的梯度会大大减小这类优化方法的有效性。另外,如果梯度表现得像白噪声,那么某个神经元对网络输出的影响将会很不稳定。
相较标准前馈网络, 残差网络中梯度相关性减少的速度从指数级下降到亚线性级 ) (1 / sqrt(L)) ,深度残差网络中,神经元梯度介于棕色噪声与白噪声之间(参见上图中的c,d,e);残差连接可以 极大地保留梯度的空间结构 。残差结构缓解了梯度破碎问题。
1x1 卷积指滤波器的尺寸为 1。当通道数为 1 时,1x1 卷积意味着卷积操作等同于乘积操作。
而当通道数更多时,1x1 卷积的作用实际上类似全连接层的神经网络结构,从而降低(或升高,取决于滤波器组数)数据的维度。
池化能压缩数据的高度(nH)及宽度(nW),而 1×1 卷积能压缩数据的通道数(nC)。在如下图所示的例子中,用 filters个大小为 1×1×32 的滤波器进行卷积,就能使原先数据包含的 32个通道压缩为 filters 个。
在这之前,网络大都是这样子的:
也就是卷积层和池化层的顺序连接。这样的话,要想提高精度,增加网络深度和宽度是一个有效途径,但也面临着参数量过多、过拟合等问题。(当然,改改超参数也可以提高性能)
有没有可能在同一层就可以提取不同(稀疏或不稀疏)的特征呢(使用不同尺寸的卷积核)?于是,2014年,在其他人都还在一味的增加网络深度时(比如vgg),GoogleNet就率先提出了卷积核的并行合并(也称Bottleneck Layer),如下图。
和卷积层、池化层顺序连接的结构(如VGG网络)相比,这样的结构主要有以下改进:
按照这样的结构来增加网络的深度,虽然可以提升性能,但是还面临计算量大(参数多)的问题。为改善这种现象,GooLeNet借鉴Network-in-Network的思想,使用1x1的卷积核实现降维操作(也间接增加了网络的深度),以此来减小网络的参数量(这里就不对两种结构的参数量进行定量比较了),如图所示。
最后实现的inception v1网络是上图结构的顺序连接
由于卷积这门课的其他内容和计算机视觉关系比较密切。对我理解推荐系统帮助不大。所以这个系列就到这里。吴恩达的课还是很好的,作业和课和测验我都认真做啦。
‘伍’ 人工神经网络概念梳理与实例演示
人工神经网络概念梳理与实例演示
神经网络是一种模仿生物神经元的机器学习模型,数据从输入层进入并流经激活阈值的多个节点。
递归性神经网络一种能够对之前输入数据进行内部存储记忆的神经网络,所以他们能够学习到数据流中的时间依赖结构。
如今机器学习已经被应用到很多的产品中去了,例如,siri、Google Now等智能助手,推荐引擎——亚马逊网站用于推荐商品的推荐引擎,Google和Facebook使用的广告排名系统。最近,深度学习的一些进步将机器学习带入公众视野:AlphaGo 打败围棋大师李世石事件以及一些图片识别和机器翻译等新产品的出现。
在这部分中,我们将介绍一些强大并被普遍使用的机器学习技术。这当然包括一些深度学习以及一些满足现代业务需求传统方法。读完这一系列的文章之后,你就掌握了必要的知识,便可以将具体的机器学习实验应用到你所在的领域当中。
随着深层神经网络的精度的提高,语音和图像识别技术的应用吸引了大众的注意力,关于AI和深度学习的研究也变得更加普遍了。但是怎么能够让它进一步扩大影响力,更受欢迎仍然是一个问题。这篇文章的主要内容是:简述前馈神经网络和递归神经网络、怎样搭建一个递归神经网络对时间系列数据进行异常检测。为了让我们的讨论更加具体化,我们将演示一下怎么用Deeplearning4j搭建神经网络。
一、什么是神经网络?
人工神经网络算法的最初构思是模仿生物神经元。但是这个类比很不可靠。人工神经网络的每一个特征都是对生物神经元的一种折射:每一个节点与激活阈值、触发的连接。
连接人工神经元系统建立起来之后,我们就能够对这些系统进行训练,从而让他们学习到数据中的一些模式,学到之后就能执行回归、分类、聚类、预测等功能。
人工神经网络可以看作是计算节点的集合。数据通过这些节点进入神经网络的输入层,再通过神经网络的隐藏层直到关于数据的一个结论或者结果出现,这个过程才会停止。神经网络产出的结果会跟预期的结果进行比较,神经网络得出的结果与正确结果的不同点会被用来更正神经网络节点的激活阈值。随着这个过程的不断重复,神经网络的输出结果就会无限靠近预期结果。
二、训练过程
在搭建一个神经网络系统之前,你必须先了解训练的过程以及网络输出结果是怎么产生的。然而我们并不想过度深入的了解这些方程式,下面是一个简短的介绍。
网络的输入节点收到一个数值数组(或许是叫做张量多维度数组)就代表输入数据。例如, 图像中的每个像素可以表示为一个标量,然后将像素传递给一个节点。输入数据将会与神经网络的参数相乘,这个输入数据被扩大还是减小取决于它的重要性,换句话说,取决于这个像素就不会影响神经网络关于整个输入数据的结论。
起初这些参数都是随机的,也就是说神经网络在建立初期根本就不了解数据的结构。每个节点的激活函数决定了每个输入节点的输出结果。所以每个节点是否能够被激活取决于它是否接受到足够的刺激强度,即是否输入数据和参数的结果超出了激活阈值的界限。
在所谓的密集或完全连接层中,每个节点的输出值都会传递给后续层的节点,在通过所有隐藏层后最终到达输出层,也就是产生输入结果的地方。在输出层, 神经网络得到的最终结论将会跟预期结论进行比较(例如,图片中的这些像素代表一只猫还是狗?)。神经网络猜测的结果与正确结果的计算误差都会被纳入到一个测试集中,神经网络又会利用这些计算误差来不断更新参数,以此来改变图片中不同像素的重要程度。整个过程的目的就是降低输出结果与预期结果的误差,正确地标注出这个图像到底是不是一条狗。
深度学习是一个复杂的过程,由于大量的矩阵系数需要被修改所以它就涉及到矩阵代数、衍生品、概率和密集的硬件使用问题,但是用户不需要全部了解这些复杂性。
但是,你也应该知道一些基本参数,这将帮助你理解神经网络函数。这其中包括激活函数、优化算法和目标函数(也称为损失、成本或误差函数)。
激活函数决定了信号是否以及在多大程度上应该被发送到连接节点。阶梯函数是最常用的激活函数, 如果其输入小于某个阈值就是0,如果其输入大于阈值就是1。节点都会通过阶梯激活函数向连接节点发送一个0或1。优化算法决定了神经网络怎么样学习,以及测试完误差后,权重怎么样被更准确地调整。最常见的优化算法是随机梯度下降法。最后, 成本函数常用来衡量误差,通过对比一个给定训练样本中得出的结果与预期结果的不同来评定神经网络的执行效果。
Keras、Deeplearning4j 等开源框架让创建神经网络变得简单。创建神经网络结构时,需要考虑的是怎样将你的数据类型匹配到一个已知的被解决的问题,并且根据你的实际需求来修改现有结构。
三、神经网络的类型以及应用
神经网络已经被了解和应用了数十年了,但是最近的一些技术趋势才使得深度神经网络变得更加高效。
GPUs使得矩阵操作速度更快;分布式计算结构让计算能力大大增强;多个超参数的组合也让迭代的速度提升。所有这些都让训练的速度大大加快,迅速找到适合的结构。
随着更大数据集的产生,类似于ImageNet 的大型高质量的标签数据集应运而生。机器学习算法训练的数据越大,那么它的准确性就会越高。
最后,随着我们理解能力以及神经网络算法的不断提升,神经网络的准确性在语音识别、机器翻译以及一些机器感知和面向目标的一些任务等方面不断刷新记录。
尽管神经网络架构非常的大,但是主要用到的神经网络种类也就是下面的几种。
3.1前馈神经网络
前馈神经网络包括一个输入层、一个输出层以及一个或多个的隐藏层。前馈神经网络可以做出很好的通用逼近器,并且能够被用来创建通用模型。
这种类型的神经网络可用于分类和回归。例如,当使用前馈网络进行分类时,输出层神经元的个数等于类的数量。从概念上讲, 激活了的输出神经元决定了神经网络所预测的类。更准确地说, 每个输出神经元返回一个记录与分类相匹配的概率数,其中概率最高的分类将被选为模型的输出分类。
前馈神经网络的优势是简单易用,与其他类型的神经网络相比更简单,并且有一大堆的应用实例。
3.2卷积神经网络
卷积神经网络和前馈神经网络是非常相似的,至少是数据的传输方式类似。他们结构大致上是模仿了视觉皮层。卷积神经网络通过许多的过滤器。这些过滤器主要集中在一个图像子集、补丁、图块的特征识别上。每一个过滤器都在寻找不同模式的视觉数据,例如,有的可能是找水平线,有的是找对角线,有的是找垂直的。这些线条都被看作是特征,当过滤器经过图像时,他们就会构造出特征图谱来定位各类线是出现在图像的哪些地方。图像中的不同物体,像猫、747s、榨汁机等都会有不同的图像特征,这些图像特征就能使图像完成分类。卷积神经网络在图像识别和语音识别方面是非常的有效的。
卷积神经网络与前馈神经网络在图像识别方面的异同比较。虽然这两种网络类型都能够进行图像识别,但是方式却不同。卷积神经网络是通过识别图像的重叠部分,然后学习识别不同部分的特征进行训练;然而,前馈神经网络是在整张图片上进行训练。前馈神经网络总是在图片的某一特殊部分或者方向进行训练,所以当图片的特征出现在其他地方时就不会被识别到,然而卷积神经网络却能够很好的避免这一点。
卷积神经网络主要是用于图像、视频、语音、声音识别以及无人驾驶的任务。尽管这篇文章主要是讨论递归神经网络的,但是卷积神经网络在图像识别方面也是非常有效的,所以很有必要了解。
3.3递归神经网络
与前馈神经网络不同的是,递归神经网络的隐藏层的节点里有内部记忆存储功能,随着输入数据的改变而内部记忆内容不断被更新。递归神经网络的结论都是基于当前的输入和之前存储的数据而得出的。递归神经网络能够充分利用这种内部记忆存储状态处理任意序列的数据,例如时间序列。
递归神经网络经常用于手写识别、语音识别、日志分析、欺诈检测和网络安全。
递归神经网络是处理时间维度数据集的最好方法,它可以处理以下数据:网络日志和服务器活动、硬件或者是医疗设备的传感器数据、金融交易、电话记录。想要追踪数据在不同阶段的依赖和关联关系需要你了解当前和之前的一些数据状态。尽管我们通过前馈神经网络也可以获取事件,随着时间的推移移动到另外一个事件,这将使我们限制在对事件的依赖中,所以这种方式很不灵活。
追踪在时间维度上有长期依赖的数据的更好方法是用内存来储存重要事件,以使近期事件能够被理解和分类。递归神经网络最好的一点就是在它的隐藏层里面有“内存”可以学习到时间依赖特征的重要性。
接下来我们将讨论递归神经网络在字符生成器和网络异常检测中的应用。递归神经网络可以检测出不同时间段的依赖特征的能力使得它可以进行时间序列数据的异常检测。
递归神经网络的应用
网络上有很多使用RNNs生成文本的例子,递归神经网络经过语料库的训练之后,只要输入一个字符,就可以预测下一个字符。下面让我们通过一些实用例子发现更多RNNs的特征。
应用一、RNNs用于字符生成
递归神经网络经过训练之后可以把英文字符当做成一系列的时间依赖事件。经过训练后它会学习到一个字符经常跟着另外一个字符(“e”经常跟在“h”后面,像在“the、he、she”中)。由于它能预测下一个字符是什么,所以它能有效地减少文本的输入错误。
Java是个很有趣的例子,因为它的结构包括很多嵌套结构,有一个开的圆括号必然后面就会有一个闭的,花括号也是同理。他们之间的依赖关系并不会在位置上表现的很明显,因为多个事件之间的关系不是靠所在位置的距离确定的。但是就算是不明确告诉递归神经网络Java中各个事件的依赖关系,它也能自己学习了解到。
在异常检测当中,我们要求神经网络能够检测出数据中相似、隐藏的或许是并不明显的模式。就像是一个字符生成器在充分地了解数据的结构后就会生成一个数据的拟像,递归神经网络的异常检测就是在其充分了解数据结构后来判断输入的数据是不是正常。
字符生成的例子表明递归神经网络有在不同时间范围内学习到时间依赖关系的能力,它的这种能力还可以用来检测网络活动日志的异常。
异常检测能够使文本中的语法错误浮出水面,这是因为我们所写的东西是由语法结构所决定的。同理,网络行为也是有结构的,它也有一个能够被学习的可预测模式。经过在正常网络活动中训练的递归神经网络可以监测到入侵行为,因为这些入侵行为的出现就像是一个句子没有标点符号一样异常。
应用二、一个网络异常检测项目的示例
假设我们想要了解的网络异常检测就是能够得到硬件故障、应用程序失败、以及入侵的一些信息。
模型将会向我们展示什么呢?
随着大量的网络活动日志被输入到递归神经网络中去,神经网络就能学习到正常的网络活动应该是什么样子的。当这个被训练的网络被输入新的数据时,它就能偶判断出哪些是正常的活动,哪些是被期待的,哪些是异常的。
训练一个神经网络来识别预期行为是有好处的,因为异常数据不多,或者是不能够准确的将异常行为进行分类。我们在正常的数据里进行训练,它就能够在未来的某个时间点提醒我们非正常活动的出现。
说句题外话,训练的神经网络并不一定非得识别到特定事情发生的特定时间点(例如,它不知道那个特殊的日子就是周日),但是它一定会发现一些值得我们注意的一些更明显的时间模式和一些可能并不明显的事件之间的联系。
我们将概述一下怎么用 Deeplearning4j(一个在JVM上被广泛应用的深度学习开源数据库)来解决这个问题。Deeplearning4j在模型开发过程中提供了很多有用的工具:DataVec是一款为ETL(提取-转化-加载)任务准备模型训练数据的集成工具。正如Sqoop为Hadoop加载数据,DataVec将数据进行清洗、预处理、规范化与标准化之后将数据加载到神经网络。这跟Trifacta’s Wrangler也相似,只不过它更关注二进制数据。
开始阶段
第一阶段包括典型的大数据任务和ETL:我们需要收集、移动、储存、准备、规范化、矢量话日志。时间跨度的长短是必须被规定好的。数据的转化需要花费一些功夫,这是由于JSON日志、文本日志、还有一些非连续标注模式都必须被识别并且转化为数值数组。DataVec能够帮助进行转化和规范化数据。在开发机器学习训练模型时,数据需要分为训练集和测试集。
训练神经网络
神经网络的初始训练需要在训练数据集中进行。
在第一次训练的时候,你需要调整一些超参数以使模型能够实现在数据中学习。这个过程需要控制在合理的时间内。关于超参数我们将在之后进行讨论。在模型训练的过程中,你应该以降低错误为目标。
但是这可能会出现神经网络模型过度拟合的风险。有过度拟合现象出现的模型往往会在训练集中的很高的分数,但是在遇到新的数据时就会得出错误结论。用机器学习的语言来说就是它不够通用化。Deeplearning4J提供正则化的工具和“过早停止”来避免训练过程中的过度拟合。
神经网络的训练是最花费时间和耗费硬件的一步。在GPUs上训练能够有效的减少训练时间,尤其是做图像识别的时候。但是额外的硬件设施就带来多余的花销,所以你的深度学习的框架必须能够有效的利用硬件设施。Azure和亚马逊等云服务提供了基于GPU的实例,神经网络还可以在异构集群上进行训练。
创建模型
Deeplearning4J提供ModelSerializer来保存训练模型。训练模型可以被保存或者是在之后的训练中被使用或更新。
在执行异常检测的过程中,日志文件的格式需要与训练模型一致,基于神经网络的输出结果,你将会得到是否当前的活动符合正常网络行为预期的结论。
代码示例
递归神经网络的结构应该是这样子的:
MultiLayerConfiguration conf = new NeuralNetConfiguration.Builder(
.seed(123)
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
.weightInit(WeightInit.XAVIER)
.updater(Updater.NESTEROVS).momentum(0.9)
.learningRate(0.005)
.gradientNormalization(GradientNormalization.ClipElementWiseAbsoluteValue)
.(0.5)
.list()
.layer(0, new GravesLSTM.Builder().activation("tanh").nIn(1).nOut(10).build())
.layer(1, new RnnOutputLayer.Builder(LossFunctions.LossFunction.MCXENT)
.activation("softmax").nIn(10).nOut(numLabelClasses).build())
.pretrain(false).backprop(true).build();
MultiLayerNetwork net = new MultiLayerNetwork(conf);
net.init();
下面解释一下几行重要的代码:
.seed(123)
随机设置一个种子值对神经网络的权值进行初始化,以此获得一个有复验性的结果。系数通常都是被随机的初始化的,以使我们在调整其他超参数时仍获得一致的结果。我们需要设定一个种子值,让我们在调整和测试的时候能够用这个随机的权值。
.optimizationAlgo(OptimizationAlgorithm.STOCHASTIC_GRADIENT_DESCENT).iterations(1)
决定使用哪个最优算法(在这个例子中是随机梯度下降法)来调整权值以提高误差分数。你可能不需要对这个进行修改。
.learningRate(0.005)
当我们使用随机梯度下降法的时候,误差梯度就被计算出来了。在我们试图将误差值减到最小的过程中,权值也随之变化。SGD给我们一个让误差更小的方向,这个学习效率就决定了我们该在这个方向上迈多大的梯度。如果学习效率太高,你可能是超过了误差最小值;如果太低,你的训练可能将会永远进行。这是一个你需要调整的超参数。
‘陆’ 神经网络异常检测方法和机器学习异常检测方法对于入侵检测的应用
神经网络异常检测方法神经网络入侵检测方法是通过训练神经网络连续的信息单元来进行异常检测,信息单元指的是命令。网络的输入为用户当前输入的命令和已执行过的W个命令;用户执行过的命令被神经网络用来预测用户输入的下一个命令,如下图。若神经网络被训练成预测用户输入命令的序列集合,则神经网络就构成用户的轮郭框架。当用这个神经网络预测不出某用户正确的后继命令,即在某种程度上表明了用户行为与其轮廓框架的偏离,这时表明有异常事件发生,以此就能作异常入侵检测。
上面式子用来分类识别,检测异常序列。实验结果表明这种方法检测迅速,而且误警率底。然而,此方法对于用户动态行为变化以及单独异常检测还有待改善。复杂的相似度量和先验知识加入到检测中可能会提高系统的准确性,但需要做进一步工作。
‘柒’ 卷积神经网络(CNN)基础
在七月初七情人节,牛郎织女相见的一天,我终于学习了CNN(来自CS231n),感觉感触良多,所以赶快记下来,别忘了,最后祝大家情人节快乐5555555.正题开始!
CNN一共有卷积层(CONV)、ReLU层(ReLU)、池化层(Pooling)、全连接层(FC(Full Connection))下面是各个层的详细解释。
卷积,尤其是图像的卷积,需要一个滤波器,用滤波器对整个图像进行遍历,我们假设有一个32*32*3的原始图像A,滤波器的尺寸为5*5*3,用w表示,滤波器中的数据就是CNN的参数的一部分,那么在使用滤波器w对A进行滤波的话,可以用下面的式子表示:
其中x为原始图像的5*5*3的一部分,b是偏置项置为1。在对A进行滤波之后,产生的是一个28*28*1的数据。那么假设我们存在6个滤波器,这六个滤波器之间彼此是独立的,也就是他们内部的数据是不同的且没有相关性的。可以理解为一个滤波器查找整幅图像的垂直边缘,一个查找水平边缘,一个查找红色,一个查找黑色这样。那么我就可以产生6个28*28*1的数据,将它们组合到一起就可以产生28*28*6的数据,这就是卷积层主要做的工作。
CNN可以看作一系列的卷积层和ReLU层对原始数据结构进行处理的神经网络,处理的过程可以用下面这幅图表示
特别要注意的是滤波器的深度一定要与上一层传来的数据的深度相同,就像上图的第二个卷积层在处理传来的28*28*6的数据时要使用5*5*6的滤波器.
滤波器在图像上不断移动对图像滤波,自然存在步长的问题,在上面我们举的例子都是步长为1的情况,如果步长为3的话,32*32*3的图像经过5*5*3的滤波器卷积得到的大小是(32-5)/3+1=10, 注:步长不能为2因为(32-5)/2+1=14.5是小数。
所以当图像大小是N,滤波器尺寸为F时,步长S,那么卷积后大小为(N-F)/S+1
我们从上面的图中可以看到图像的长和宽在逐渐的减小,在经过超过5层之后极可能只剩下1*1的空间尺度,这样是十分不好的,而且也不利于我们接下来的计算,所以我们想让卷积层处理完之后图像在空间尺度上大小不变,所以我们引入了pad the border的操作。pad其实就是在图像周围补0,扩大图像的尺寸,使得卷积后图像大小不变。在CNN中,主要存在4个超参数,滤波器个数K,滤波器大小F,pad大小P和步长S,其中P是整数,当P=1时,对原始数据的操作如图所示:
那么在pad操作后卷积后的图像大小为:(N-F+2*P)/S+1
而要想让卷积层处理后图像空间尺度不变,P的值可以设为P=(F-1)/2
卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有4个超参数:
K:滤波器个数
P:pad属性值
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F+2P)/S+1
H 2 =(H 1 -F+2P)/S+1
D 2 =D 1
1*1的滤波器也是有意义的,它在深度方向做卷积,例如1*1*64的滤波器对56*56*64的数据卷积得到56*56的数据
F通常是奇数,这样可以综合考虑上下左右四个方向的数据。
卷积层从神经元的角度看待可以有两个性质: 参数共享和局域连接 。对待一个滤波器,例如5*5*3的一个滤波器,对32*32*3的数据卷积得到28*28的数据,可以看作存在28*28个神经元,每个对原图像5*5*3的区域进行计算,这28*28个神经元由于使用同一个滤波器,所以参数相同,我们称这一特性为 参数共享 。
针对不同的滤波器,我们可以看到他们会看到同一区域的图像,相当于在深度方向存在多个神经元,他们看着相同区域叫做 局域连接
参数共享减少了参数的数量,防止了过拟合
局域连接为查找不同特征更丰富的表现图像提供了可能。
卷积就像是对原图像的另一种表达。
激活函数,对于每一个维度经过ReLU函数输出即可。不改变数据的空间尺度。
通过pad操作,输出图像在控件上并没有变化,但是深度发生了变化,越来越庞大的数据给计算带来了困难,也出现了冗余的特征,所以需要进行池化操作,池化不改变深度,只改变长宽,主要有最大值和均值两种方法,一般的池化滤波器大小F为2步长为2,对于最大值池化可以用下面的图像清晰的表示:
卷积层输入W 1 *H 1 *D 1 大小的数据,输出W 2 *H 2 *D 2 的数据,此时的卷积层共有2个超参数:
S:滤波器每次移动的步长
F:滤波器尺寸
此时输出的大小可以用输入和超参计算得到:
W 2 =(W 1 -F)/S+1
H 2 =(H 1 -F)/S+1
D 2 =D 1
将最后一层(CONV、ReLU或Pool)处理后的数据输入全连接层,对于W 2 *H 2 *D 2 数据,我们将其展成1*1*W 2 *H 2 *D 2 大小的数据,输入层共有W 2 *H 2 *D 2 个神经元,最后根据问题确定输出层的规模,输出层可以用softmax表示。也就是说,全连接层就是一个常见的BP神经网络。而这个网络也是参数最多的部分,是接下来想要去掉的部分。完整的神经网络可以用下面的图表示:
[(CONV-ReLU)*N-POOL?]*M-(FC-RELU)*K,SoftMax
1.更小的滤波器与更深的网络
2.只有CONV层而去掉池化与全链接
最早的CNN,用于识别邮编,结构为:
CONV-POOL-CONV-POOL-CONV-FC
滤波器大小5*5,步长为1,池化层2*2,步长为2
2012年由于GPU技术所限,原始AlexNet为两个GPU分开计算,这里介绍合起来的结构。
输入图像为227*227*3
1.首次使用ReLU
2.使用Norm layers,现在已经抛弃,因为效果不大
3.数据经过预处理(例如大小变化,颜色变化等)
4.失活比率0.5
5.batch size 128
6.SGD Momentum 参数0.9(SGD和Momentum见我的其他文章)
7.学习速率 0.01,准确率不在提升时减少10倍,1-2次后达到收敛
8.L2权重减少0.0005
9.错误率15.4%
改进自AlexNet,主要改变:
1.CONV1的滤波器从11*11步长S=4改为7*7步长为2.
2.CONV3,4,5滤波器数量有384,384,256改为512,1024,512(滤波器数量为2的n次幂有利于计算机计算可以提高效率)
错误率:14.8%后继续改进至11.2%
当前最好的最易用的CNN网络,所有卷积层滤波器的大小均为3*3,步长为1,pad=1,池化层为2*2的最大值池化,S=2。
主要参数来自全连接层,这也是想要去掉FC的原因。
具有高度的统一性和线性的组合,易于理解,十分方便有VGG-16,VGG-19等多种结构。
错误率7.3%
完全移除FC层,参数只有500万,使用Inception模块(不太理解,有时间继续看)
准确率6.67%
准确率3.6%
拥有极深的网络结构,且越深准确率越高。是传统CNN不具备的特点,传统CNN并非越深越准确。需要训练时间较长但是快于VGG
1.每个卷积层使用Batch Normalization
2.Xavier/2初始化
3.SGD+Momentum(0.9)
4.Learning rate:0.1,准确率不变减小10倍(因为Batch Normalization所以比AlexNet大)
5.mini-batch size 256
6.Weight decay of 0.00001
7.不适用失活(因为Batch Normalization)
具体的梯度过程学完ResNet再说吧。
‘捌’ 卷积神经网络
1、二维互相关运算
二维互相关(cross-correlation)运算的输入是一个二维输入数组和一个二维核(kernel)数组,输出也是一个二维数组,其中核数组通常称为卷积核或过滤器(filter)。卷积核的尺寸通常小于输入数组,卷积核在输入数组上滑动,在每个位置上,卷积核与该位置处的输入子数组按元素相乘并求和,得到输出数组中相应位置的元素。图1展示了一个互相关运算的例子,阴影部分分别是输入的第一个计算区域、核数组以及对应的输出。
2、二维卷积层
卷积层得名于卷积运算,但卷积层中用到的并非卷积运算而是互相关运算。我们将核数组上下翻转、左右翻转,再与输入数组做互相关运算,这一过程就是卷积运算。由于卷积层的核数组是可学习的,所以使用互相关运算与使用卷积运算并无本质区别。
二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏置来得到输出。卷积层的模型参数包括卷积核和标量偏置。
3、特征图与感受野
二维卷积层输出的二维数组可以看作是输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map)。影响元素x的前向计算的所有可能输入区域(可能大于输入的实际尺寸)叫做x的感受野(receptive field)。
以图1为例,输入中阴影部分的四个元素是输出中阴影部分元素的感受野。我们将图中形状为2×2的输出记为Y,将Y与另一个形状为2×2的核数组做互相关运算,输出单个元素z。那么,z在Y上的感受野包括Y的全部四个元素,在输入上的感受野包括其中全部9个元素。可见,我们可以通过更深的卷积神经网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征。
4、填充和步幅
我们介绍卷积层的两个超参数,即填充和步幅,它们可以对给定形状的输入和卷积核改变输出形状。
4.1 填充(padding)
是指在输入高和宽的两侧填充元素(通常是0元素),图2里我们在原输入高和宽的两侧分别添加了值为0的元素。
如果原输入的高和宽是 和 ,卷积核的高和宽是 和 ,在高的两侧一共填充 行,在宽的两侧一共填充 列,则输出形状为:
)
我们在卷积神经网络中使用奇数高宽的核,比如3×3,5×5的卷积核,对于高度(或宽度)为大小为2k+1的核,令步幅为1,在高(或宽)两侧选择大小为k的填充,便可保持输入与输出尺寸相同。
4.2 步幅(stride)
在互相关运算中,卷积核在输入数组上滑动,每次滑动的行数与列数即是步幅(stride)。此前我们使用的步幅都是1,图3展示了在高上步幅为3、在宽上步幅为2的二维互相关运算。
一般来说,当高上步幅为 ,宽上步幅为 时,输出形状为:
如果 ,那么输出形状将简化为:
更进一步,如果输入的高和宽能分别被高和宽上的步幅整除,那么输出形状将是:(nh/sh)×(nw/sw)
当 时,我们称填充为p;当 时,我们称步幅为s。
5、多输入通道和多输出通道
之前的输入和输出都是二维数组,但真实数据的维度经常更高。例如,彩色图像在高和宽2个维度外还有RGB(红、绿、蓝)3个颜色通道。假设彩色图像的高和宽分别是h和w(像素),那么它可以表示为一个3×h×w的多维数组,我们将大小为3的这一维称为通道(channel)维。
5.1 多输入通道
卷积层的输入可以包含多个通道,图4展示了一个含2个输入通道的二维互相关计算的例子。
5.2 多输出通道
卷积层的输出也可以包含多个通道,设卷积核输入通道数和输出通道数分别为ci和co,高和宽分别为kh和kw。如果希望得到含多个通道的输出,我们可以为每个输出通道分别创建形状为ci×kh×kw的核数组,将它们在输出通道维上连结,卷积核的形状即co×ci×kh×kw。
对于输出通道的卷积核,我们提供这样一种理解,一个ci×kh×kw的核数组可以提取某种局部特征,但是输入可能具有相当丰富的特征,我们需要有多个这样的ci×kh×kw的核数组,不同的核数组提取的是不同的特征。
5.3 1x1卷积层
最后讨论形状为1×1的卷积核,我们通常称这样的卷积运算为1×1卷积,称包含这种卷积核的卷积层为1×1卷积层。图5展示了使用输入通道数为3、输出通道数为2的1×1卷积核的互相关计算。
1×1卷积核可在不改变高宽的情况下,调整通道数。1×1卷积核不识别高和宽维度上相邻元素构成的模式,其主要计算发生在通道维上。假设我们将通道维当作特征维,将高和宽维度上的元素当成数据样本,那么1×1卷积层的作用与全连接层等价。
6、卷积层与全连接层的对比
二维卷积层经常用于处理图像,与此前的全连接层相比,它主要有两个优势:
一是全连接层把图像展平成一个向量,在输入图像上相邻的元素可能因为展平操作不再相邻,网络难以捕捉局部信息。而卷积层的设计,天然地具有提取局部信息的能力。
二是卷积层的参数量更少。不考虑偏置的情况下,一个形状为(ci,co,h,w)的卷积核的参数量是ci×co×h×w,与输入图像的宽高无关。假如一个卷积层的输入和输出形状分别是(c1,h1,w1)和(c2,h2,w2),如果要用全连接层进行连接,参数数量就是c1×c2×h1×w1×h2×w2。使用卷积层可以以较少的参数数量来处理更大的图像。
X=torch.rand(4,2,3,5)
print(X.shape)
conv2d=nn.Conv2d(in_channels=2,out_channels=3,kernel_size=(3,5),stride=1,padding=(1,2))
Y=conv2d(X)
print('Y.shape: ',Y.shape)
print('weight.shape: ',conv2d.weight.shape)
print('bias.shape: ',conv2d.bias.shape)
输出:
torch.Size([4, 2, 3, 5])
Y.shape: torch.Size([4, 3, 3, 5])
weight.shape: torch.Size([3, 2, 3, 5])
bias.shape: torch.Size([3])
7、池化
7.1 二维池化层
池化层主要用于缓解卷积层对位置的过度敏感性。同卷积层一样,池化层每次对输入数据的一个固定形状窗口(又称池化窗口)中的元素计算输出,池化层直接计算池化窗口内元素的最大值或者平均值,该运算也分别叫做最大池化或平均池化。图6展示了池化窗口形状为2×2的最大池化。
二维平均池化的工作原理与二维最大池化类似,但将最大运算符替换成平均运算符。池化窗口形状为p×q的池化层称为p×q池化层,其中的池化运算叫作p×q池化。
池化层也可以在输入的高和宽两侧填充并调整窗口的移动步幅来改变输出形状。池化层填充和步幅与卷积层填充和步幅的工作机制一样。
在处理多通道输入数据时,池化层对每个输入通道分别池化,但不会像卷积层那样将各通道的结果按通道相加。这意味着池化层的输出通道数与输入通道数相等。
CNN网络中另外一个不可导的环节就是Pooling池化操作,因为Pooling操作使得feature map的尺寸变化,假如做2×2的池化,假设那么第l+1层的feature map有16个梯度,那么第l层就会有64个梯度,这使得梯度无法对位的进行传播下去。其实解决这个问题的思想也很简单,就是把1个像素的梯度传递给4个像素,但是需要保证传递的loss(或者梯度)总和不变。根据这条原则,mean pooling和max pooling的反向传播也是不同的。
7.2 mean pooling
mean pooling的前向传播就是把一个patch中的值求取平均来做pooling,那么反向传播的过程也就是把某个元素的梯度等分为n份分配给前一层,这样就保证池化前后的梯度(残差)之和保持不变,还是比较理解的,图示如下:
mean pooling比较容易让人理解错的地方就是会简单的认为直接把梯度复制N遍之后直接反向传播回去,但是这样会造成loss之和变为原来的N倍,网络是会产生梯度爆炸的。
7.3 max pooling
max pooling也要满足梯度之和不变的原则,max pooling的前向传播是把patch中最大的值传递给后一层,而其他像素的值直接被舍弃掉。那么反向传播也就是把梯度直接传给前一层某一个像素,而其他像素不接受梯度,也就是为0。所以max pooling操作和mean pooling操作不同点在于需要记录下池化操作时到底哪个像素的值是最大,也就是max id。
源码中有一个max_idx_的变量,这个变量就是记录最大值所在位置的,因为在反向传播中要用到,那么假设前向传播和反向传播的过程就如下图所示。
7.4 Pytorch 实现池化层
我们使用Pytorch中的nn.MaxPool2d实现最大池化层,关注以下构造函数参数:
kernel_size – the size of the window to take a max over
stride – the stride of the window. Default value is kernel_size
padding – implicit zero padding to be added on both sides
forward函数的参数为一个四维张量,形状为 ,返回值也是一个四维张量,形状为 ,其中N是批量大小,C,H,W分别表示通道数、高度、宽度。
X=torch.arange(32,dtype=torch.float32).view(1,2,4,4)
pool2d=nn.MaxPool2d(kernel_size=3,padding=1,stride=(2,1))
Y=pool2d(X)
print(X)
print(Y)
练习
1、假如你用全连接层处理一张256 \times 256256×256的彩色(RGB)图像,输出包含1000个神经元,在使用偏置的情况下,参数数量是:
答:图像展平后长度为3×256×256,权重参数和偏置参数的数量是3× 256× 256 × 1000 + 1000 =196609000。
2、假如你用全连接层处理一张256×256的彩色(RGB)图像,卷积核的高宽是3×3,输出包含10个通道,在使用偏置的情况下,这个卷积层共有多少个参数:
答:输入通道数是3,输出通道数是10,所以参数数量是10×3×3×3+10=280。
3、conv2d = nn.Conv2d(in_channels=3, out_channels=4, kernel_size=3, padding=2),输入一张形状为3×100×100的图像,输出的形状为:
答:输出通道数是4,上下两侧总共填充4行,卷积核高度是3,所以输出的高度是104 - 3 + 1=102104−3+1=102,宽度同理可得。
4、关于卷积层,以下哪种说法是错误的:
A.1×1卷积可以看作是通道维上的全连接
B.某个二维卷积层用于处理形状为3×100×100的输入,则该卷积层无法处理形状为3×256×256的输入
C.卷积层通过填充、步幅、输入通道数、输出通道数等调节输出的形状
D .两个连续的3×3卷积核的感受野与一个5×5卷积核的感受野相同
答:选B,对于高宽维度,只要输入的高宽(填充后的)大于或等于卷积核的高宽即可进行计算。
the first layer is a 3 × 3 convolution, the second is a fully connected layer on top of the 3 × 3 output grid of the first layer (see Figure 1). Sliding this small network over the input activation grid boils down to replacing the 5 × 5 convolution with two layers of 3 × 3 convolution.
我们假设图片是5*5的
我们使用5*5的卷积核对其卷积,步长为1,得到的结果是:(5-5)/1+1=1
然后我们使用2个卷积核为3*3的,这里的两个是指2层:
第一层3*3:
得到的结果是(5-3)/1+1=3
第二层3*3:
得到的结果是(3-3)/1+1=1
所以我们的最终得到结果感受野大小和用5*5的卷积核得到的结果大小是一样的!!!
5、关于池化层,以下哪种说法是错误的:
A.池化层不参与反向传播
B.池化层没有模型参数
C.池化层通常会减小特征图的高和宽
D.池化层的输入和输出具有相同的通道数
答:A
选项1:错误,池化层有参与模型的正向计算,同样也会参与反向传播
选项2:正确,池化层直接对窗口内的元素求最大值或平均值,并没有模型参数参与计算
选项3:正确
选项4:正确
参考文献:
https://www.boyuai.com/
https://blog.csdn.net/qq_21578849/article/details/94667699
https://www.hu.com/question/265791259/answer/298610437
https://blog.csdn.net/zouxiaolv/article/details/97366681
‘玖’ 34-卷积神经网络(Conv)
深度学习网络和普通神经网络的区别
全连接神经网络的缺点
卷积神经网络的错误率
卷积神经网络的发展历程
卷积神经网络的结构
结构特点:
神经网络(neural networks)的基本组成包括输入层、隐藏层、输出层。而卷积神经网络的特点在于隐藏层分为卷积层和池化层(pooling layer,又叫下采样层)。
卷积过程
纠正:卷积层的过滤器,就是一个矩阵,里面的元素是对应扫描时每个像素点的权重
即:每个过滤器会产生一张feature map
0填充的两种方式
卷积核在提取特征映射时的动作称之为padding(零填充),由于移动步长不一定能整出整张图的像素宽度。其中有两种方式,SAME和VALID
彩色图片的卷积过程
由于彩色图片有3个通道,即3张表,所以filter需要分3次去分别观察,每次观察的结果直接相加作为最后的结果
过滤器的个数
有几个过滤器,就会生成几张表。eg:
对于[28, 28, 1]的图片,如果有32个过滤器,就会卷积的结果就为[28, 28, 32],相当于图片被“拉长”了
观察结果大小的计算
面试可能考
注意:如果计算结果出现小数,需要结合情况具体考虑,而不是说直接四舍五入
卷积的api
在卷积神经网络中,主要使用Relu函数作为激活函数
即在这里使用relu函数去掉了像素中小于0的值
神经网络中为什么要使用激活函数
为什么使用relu而不再使用sigmoid函数?
api
卷积就是进行特征的提取,观察更加仔细,然而,观察仔细就意味着数据多,运算量增加,这就需要使用池化层以减少计算量
Pooling层主要的作用是特征提取,通过去掉Feature Map中不重要的样本,进一步减少参数数量。Pooling的方法很多,最常用的是Max Pooling。
池化层也有一个窗口大小(过滤器)
即:池化过程让图片变得更“窄”
即:卷积层使得图片变长,池化层使得图片变窄,所以经过卷积,图片越来越“细长”
api
池化中SAME的计算方式与卷积过程中SAME的计算方式一样。eg:
[None, 28, 28, 32]的数据,经过2x2,步长为2,padding为SAME的池化,变成了[None, 14, 14, 32]
分析:前面的卷积和池化相当于做特征工程,后面的全连接相当于做特征加权。最后的全连接层在整个卷积神经网络中起到“分类器”的作用。
所以神经网络也相当于是一个特征选择的方式