CNN(卷积神经网络)算法

2024-05-12

1. CNN(卷积神经网络)算法

基础知识讲解:
   卷积:通过两个函数f 和g 生成第三个函数的一种数学算子,表征函数f 与g经过翻转和平移的重叠部分函数值乘积对重叠长度的积分。
   前馈神经网络:各神经元分层排列,每个神经元只与前一层的神经元相连,接收前一层的输出,并输出给下一层.各层间没有反馈。
   卷积神经网络:是一类包含卷积计算且具有深度结构的前馈神经网络
   卷积核:就是图像处理时,给定输入图像,输入图像中一个小区域中像素加权平均后成为输出图像中的每个对应像素,其中权值由一个函数定义,这个函数称为卷积核。
   下采样:对于一个样值序列间隔几个样值取样一次,这样得到新序列就是原序列的下采样。
   结构介绍
   输入层:用于数据输入
   卷积层:利用卷积核进行特征提取和特征映射
   激励层:非线性映射,卷积是线性映射,弥补不足
   池化层:进行下采样,对特征图稀疏处理,减少数据运算量
   全连接层:在CNN的尾部进行重新拟合,减少特征信息的损失
  
 输入层:
   在CNN的输入层中,(图片)数据输入的格式 与 全连接神经网络的输入格式(一维向量)不太一样。CNN的输入层的输入格式保留了图片本身的结构。
   对于黑白的 28×28 的图片,CNN的输入是一个 28×28 的的二维神经元:
   而对于RGB格式的28×28图片,CNN的输入则是一个 3×28×28 的三维神经元(RGB中的每一个颜色通道都有一个 28×28 的矩阵)
  
 卷积层:
                                          
 左边是输入,中间部分是两个不同的滤波器Filter w0、Filter w1,最右边则是两个不同的输出。
   ai.j=f(∑m=02∑n=02wm,nxi+m,j+n+wb)
   wm,n:filter的第m行第n列的值
   xi,j: 表示图像的第i行第j列元素
   wb:用表示filter的偏置项
   ai,j:表示Feature Map的第i行第j列元素
   f:表示Relu激活函数
  
 激励层:
   使用的激励函数一般为ReLu函数:
   f(x)=max(x,0)
   卷积层和激励层通常合并在一起称为“卷积层”。
  
 池化层:
   当输入经过卷积层时,若感受视野比较小,布长stride比较小,得到的feature map (特征图)还是比较大,可以通过池化层来对每一个 feature map 进行降维操作,输出的深度还是不变的,依然为 feature map 的个数。
   池化层也有一个“池化视野(filter)”来对feature map矩阵进行扫描,对“池化视野”中的矩阵值进行计算,一般有两种计算方式:
   Max pooling:取“池化视野”矩阵中的最大值
   Average pooling:取“池化视野”矩阵中的平均值
                                          
 训练过程:
   1.前向计算每个神经元的输出值aj( 表示网络的第j个神经元,以下同);
   2.反向计算每个神经元的误差项σj,σj在有的文献中也叫做敏感度(sensitivity)。它实际上是网络的损失函数Ed对神经元加权输入的偏导数
   3.计算每个神经元连接权重wi,j的梯度( wi,j表示从神经元i连接到神经元j的权重)
   1.最后,根据梯度下降法则更新每个权重即可。
   参考: https://blog.csdn.net/love__live1/article/details/79481052

CNN(卷积神经网络)算法

2. CNN(卷积神经网络)是什么?

在数字图像处理的时候我们用卷积来滤波是因为我们用的卷积模版在频域上确实是高通低通带通等等物理意义上的滤波器。然而在神经网络中,模版的参数是训练出来的,我认为是纯数学意义的东西,很难理解为在频域上还有什么意义,所以我不认为神经网络里的卷积有滤波的作用。接着谈一下个人的理解。首先不管是不是卷积神经网络,只要是神经网络,本质上就是在用一层层简单的函数(不管是sigmoid还是Relu)来拟合一个极其复杂的函数,而拟合的过程就是通过一次次back propagation来调参从而使代价函数最小。

3. 卷积神经网络(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再说吧。

卷积神经网络(CNN)基础

4. 神经网络:卷积神经网络(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的 卷积核 :
  
    1  0  1
  
    0  1  0
  
    1  0  1
  
 来对图像进行卷积操作(可以理解为有一个滑动窗口,把卷积核与对应的图像像素做乘积然后求和),得到了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)按极小化误差的方法反向传播调整权矩阵。

5. 一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用)

在 CNN 出现之前,图像对于人工智能来说是一个难题,有2个原因:
  
 图像需要处理的数据量太大,导致成本很高,效率很低
  
 图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不高
  
 下面就详细说明一下这2个问题:
  
 
  
  
 图像是由像素构成的,每个像素又是由颜色构成的。
                                          
 现在随随便便一张图片都是 1000×1000 像素以上的, 每个像素都有RGB 3个参数来表示颜色信息。
  
 假如我们处理一张 1000×1000 像素的图片,我们就需要处理3百万个参数!
  
 1000×1000×3=3,000,000
  
 这么大量的数据处理起来是非常消耗资源的,而且这只是一张不算太大的图片!
  
  卷积神经网络 – CNN 解决的第一个问题就是「将复杂问题简化」,把大量参数降维成少量参数,再做处理。 
  
  更重要的是:我们在大部分场景下,降维并不会影响结果。比如1000像素的图片缩小成200像素,并不影响肉眼认出来图片中是一只猫还是一只狗,机器也是如此。 
  
 
  
  
 图片数字化的传统方式我们简化一下,就类似下图的过程:
                                          
 假如有圆形是1,没有圆形是0,那么圆形的位置不同就会产生完全不同的数据表达。但是从视觉的角度来看, 图像的内容(本质)并没有发生变化,只是位置发生了变化 。
  
 所以当我们移动图像中的物体,用传统的方式的得出来的参数会差异很大!这是不符合图像处理的要求的。
  
  而 CNN 解决了这个问题,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。 
  
 那么卷积神经网络是如何实现的呢?在我们了解 CNN 原理之前,先来看看人类的视觉原理是什么?
  
 
  
  
 深度学习的许多研究成果,离不开对大脑认知原理的研究,尤其是视觉原理的研究。
  
 1981 年的诺贝尔医学奖,颁发给了 David Hubel(出生于加拿大的美国神经生物学家) 和TorstenWiesel,以及 Roger Sperry。前两位的主要贡献,是“ 发现了视觉系统的信息处理 ”,可视皮层是分级的。
  
 人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。下面是人脑进行人脸识别的一个示例:
                                          
 
  
  
 对于不同的物体,人类视觉也是通过这样逐层分级,来进行认知的:
                                          
 我们可以看到,在最底层特征基本上是类似的,就是各种边缘,越往上,越能提取出此类物体的一些特征(轮子、眼睛、躯干等),到最上层,不同的高级特征最终组合成相应的图像,从而能够让人类准确的区分不同的物体。
  
 那么我们可以很自然的想到:可以不可以模仿人类大脑的这个特点,构造多层的神经网络,较低层的识别初级的图像特征,若干底层特征组成更上一层特征,最终通过多个层级的组合,最终在顶层做出分类呢?
  
  答案是肯定的,这也是许多深度学习算法(包括CNN)的灵感来源。 
  
 
  
  
 典型的 CNN 由3个部分构成:
  
 卷积层
  
 池化层
  
 全连接层
  
 如果简单来描述的话:
  
 卷积层负责提取图像中的局部特征;池化层用来大幅降低参数量级(降维);全连接层类似传统神经网络的部分,用来输出想要的结果。
                                          
 下面的原理解释为了通俗易懂,忽略了很多技术细节,如果大家对详细的原理感兴趣,可以看这个视频《 卷积神经网络基础 》。
  
 
  
  
 卷积层的运算过程如下图,用一个卷积核扫完整张图片:
                                          
 这个过程我们可以理解为我们使用一个过滤器(卷积核)来过滤图像的各个小区域,从而得到这些小区域的特征值。
  
 在具体应用中,往往有多个卷积核,可以认为,每个卷积核代表了一种图像模式,如果某个图像块与此卷积核卷积出的值大,则认为此图像块十分接近于此卷积核。如果我们设计了6个卷积核,可以理解:我们认为这个图像上有6种底层纹理模式,也就是我们用6中基础模式就能描绘出一副图像。以下就是25种不同的卷积核的示例:
                                          
  总结:卷积层的通过卷积核的过滤提取出图片中局部的特征,跟上面提到的人类视觉的特征提取类似。 
  
 
  
  
 池化层简单说就是下采样,他可以大大降低数据的维度。其过程如下:
                                          
 上图中,我们可以看到,原始图片是20×20的,我们对其进行下采样,采样窗口为10×10,最终将其下采样成为一个2×2大小的特征图。
  
 之所以这么做的原因,是因为即使做完了卷积,图像仍然很大(因为卷积核比较小),所以为了降低数据维度,就进行下采样。
  
  总结:池化层相比卷积层可以更有效的降低数据维度,这么做不但可以大大减少运算量,还可以有效的避免过拟合。 
  
 
  
  
 这个部分就是最后一步了,经过卷积层和池化层处理过的数据输入到全连接层,得到最终想要的结果。
  
 经过卷积层和池化层降维过的数据,全连接层才能”跑得动”,不然数据量太大,计算成本高,效率低下。
                                          
 典型的 CNN 并非只是上面提到的3层结构,而是多层结构,例如 LeNet-5 的结构就如下图所示:
  
  卷积层 – 池化层- 卷积层 – 池化层 – 卷积层 – 全连接层 
  
 在了解了 CNN 的基本原理后,我们重点说一下 CNN 的实际应用有哪些。
  
 
  
  
 卷积神经网络 – CNN 很擅长处理图像。而视频是图像的叠加,所以同样擅长处理视频内容。下面给大家列一些比较成熟的应用�:
  
 
  
  
  图像分类、检索 
  
 图像分类是比较基础的应用,他可以节省大量的人工成本,将图像进行有效的分类。对于一些特定领域的图片,分类的准确率可以达到 95%+,已经算是一个可用性很高的应用了。
  
 典型场景:图像搜索…
                                          
 
  
  
  目标定位检测 
  
 可以在图像中定位目标,并确定目标的位置及大小。
  
 典型场景:自动驾驶、安防、医疗…
                                          
 
  
  
  目标分割 
  
 简单理解就是一个像素级的分类。
  
 他可以对前景和背景进行像素级的区分、再高级一点还可以识别出目标并且对目标进行分类。
  
 典型场景:美图秀秀、视频后期加工、图像生成…
                                          
 
  
  
  人脸识别 
  
 人脸识别已经是一个非常普及的应用了,在很多领域都有广泛的应用。
  
 典型场景:安防、金融、生活…
                                          
 
  
  
  骨骼识别 
  
 骨骼识别是可以识别身体的关键骨骼,以及追踪骨骼的动作。
  
 典型场景:安防、电影、图像视频生成、游戏…
                                          
 
  
  
 今天我们介绍了 CNN 的价值、基本原理和应用场景,简单总结如下:
  
  CNN 的价值: 
  
 能够将大数据量的图片有效的降维成小数据量(并不影响结果)
  
 能够保留图片的特征,类似人类的视觉原理
  
  CNN 的基本原理: 
  
 卷积层 – 主要作用是保留图片的特征
  
 池化层 – 主要作用是把数据降维,可以有效的避免过拟合
  
 全连接层 – 根据不同任务输出我们想要的结果
  
  CNN 的实际应用: 
  
 图片分类、检索
  
 目标定位检测
  
 目标分割
  
 人脸识别
  
 骨骼识别
  
 本文首发在 easyAI - 人工智能知识库
  
 《 一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用) 》

一文看懂卷积神经网络-CNN(基本原理+独特价值+实际应用)

6. 卷积神经网络(Convolutional Neural Networks, CNN)——更有效率地提取特征

 卷积神经网络(Convolutional Neural Networks, CNN)——更有效率地提取特征
   图像识别问题本质上就是分类问题,比如我们要区分猫和狗,那么我们就需要构建一个模型,将照片丢进去后,模型能输出猫或者狗的概率有多大。在做图像识别时首要的就是要提取图片的特征,那么如何提取图片的特征呢?前面讲到了前向全连接网络,我们可以尝试用前向全连接网络提取。假设图片的像素是100*100,如果如片是彩色的,每个像素都有RGB三种颜色的数值。因此,一张图片是有一个三维向量构成的,一维是长100,一维是宽100,还有一维是R、G、B 3个通道(channels)。把这个三维向量拉直作为一个一维向量,长度就是100*100*3。
   
                                                                                   
    我们在区分一张图片时,我们观察的往往是图片的局部的、最重要的特征。   比如图片上是一只鸟,我们可能通过嘴巴、眼睛、爪子等就可以判断出是一只鸟了。因此,输入层的每一个神经元没有必要看图片的全局,只需要看一个局部就行了。   
                                                                                                                           
    在两张不同的图片上,同一个特征区域可能处于不同位置。  比如鸟嘴的局部特征区域在下面这两张图上就处在不同的位置上。那么如何才能让两个不同的神经元在看到这两个不同的感受野时,能产生一致的特征值呢?   
                                                                                   
    对上面的内容进行一个总结:    (1)我们设置一个局部感受野,假设感受野的大小为W*H*C,其中W表示感受野的宽度,H表示感受野的高度,C表示感受野的通道数。那么对应的神经元的参数的个数就为:W*H*C个权值加1个偏置。在卷积神经网络中,我们称这样一个神经元为一个 滤波器(filter) 。   (3)我们通过滑动的方式让感受野铺满整个图片,假设图片的尺寸是W1*H1*C,滑动步长为S,零填充的数量为P。假设感受野的个数是W2*H2,其中,        (4)我们让所有感受野的观测滤波器参数进行共享,即相当于一个滤波器通过滑动扫描的方式扫描了所有感受野。   (5)我们设置多个滤波器,假设滤波器的个数为K,这K个滤波器都通过滑动扫描的方式扫过整个图片。此时参数的个数为:(W*H*C+1)*K。   (6)由于每个滤波器每经过一个感受野都会进行一次计算输出一个值,所以输出的维度为:W2*H2*K。我们将这个输出称为特征图,所以特征图宽度为W2,高度为H2,通道数C2=K。    举个例子:  假设某个图片的大小是100*100*3,设置滤波器的大小为3*3*3,滤波器的个数为64,设置步长S=1,设置零填充的数量为P=0。那么卷积神经网络的参数为,  相比前向全连接  个参数,参数的个数缩小了几个数量级。   输出特征图的宽度和高度均为,  输出特征图的通道数为,  所以输出特征图的维度为98*98*64。   如果在上面输出的基础上再叠加一层卷积神经网络,滤波器的设置宽和高可以不变,但是通道数不再是3了,而是变成64了,因为输入特征图的通道数已经变64了。假设滤波器的大小为3*3*64,滤波器的个数为32,设置步长S=1,设置零填充的数量为P=0。可以计算出来,新的输出特征图的维度是96*96*32。
   以上就是卷积神经网络(CNN)的解析。但是CNN一般不是单独用的,因为一般提取图片的特征是为了分类,还需要进一步处理,常见的形式如下图所示。   
                                           

7. [图像算法]-理解卷积神经网络CNN中的特征图(feature map)

   在每个卷积层,数据都是以三维形式存在的。你可以把它看成许多个二维图片叠在一起,其中每一个称为一个feature map。在输入层,如果是灰度图片,那就只有一个feature map;如果是彩色图片,一般就是3个feature map(红绿蓝)。层与层之间会有若干个卷积核(kernel),上一层和每个feature map跟每个卷积核做卷积,都会产生下一层的一个feature map。     feature map(下图红线标出) 即:该层卷积核的个数,有多少个卷积核,经过卷积就会产生多少个feature map,也就是下图中  豆腐皮儿 的层数、同时也是下图 豆腐块 的深度(宽度)!!这个宽度可以手动指定,一般网络越深的地方这个值越大,因为随着网络的加深,feature map的长宽尺寸缩小,本卷积层的每个map提取的特征越具有代表性(精华部分),所以后一层卷积层需要增加feature map的数量,才能更充分的提取出前一层的特征,一般是成倍增加(不过具体论文会根据实验情况具体设置)!   
                                                                                                                                                                                                           
    feature map计算方法    
                                                                                   

[图像算法]-理解卷积神经网络CNN中的特征图(feature map)

8. 卷积神经网络CNN(Convolutional Neural Network)

 上图计算过程为,首先我们可以将右边进行卷积的可以称为过滤器也可以叫做核,覆盖到左边第一个区域,然后分别按照对应位置相乘再相加,3*1+1*1+2*1+0*0+0*0+0*0+1*(-1)+8*(-1)+2*(-1)=-5;   按照上述的计算方法逐步按右移一个步长(步长可以设定为1,2,...等),然后按往下移,逐渐计算相应的值,得出最终的值。
                                           如上图显示,对于第一个图像矩阵对应的图,一边是白色,一边是黑色,那么中间就会存在一个垂直的边缘,我们可以选择一个垂直边缘检测过滤器,如乘法右边的矩阵,那么两者做卷积后得出的图会显示如等号右边的结果矩阵对应的灰度图中间会有一个白色的中间带,也就是检测出来的边缘,那为什么感觉中间边缘带会比较宽呢?而不是很细的一个局域呢?原因是我们输入的图像只有6*6,过于小了,如果我们选择输出更大的尺寸的图,那么结果来说就是相对的一个细的边缘检测带,也就将我们的垂直边缘特征提取出来了。   上述都是人工选择过滤器的参数,随着神经网络的发展我们可以利用反向传播算法来学习过滤器的参数
                                           我们可以将卷积的顾虑器的数值变成一个参数,通过反向传播算法去学习,这样学到的过滤器或者说卷积核就能够识别到很多的特征,而不是依靠手工选择过滤器。
   - padding 操作,卷积经常会出现两个问题:   1.每经过一次卷积图像都会缩小,如果卷积层很多的话,后面的图像就缩的很小了;   2.边缘像素利用次数只有一次,很明显少于位于中间的像素,因此会损失边缘图像信息。   为了解决上述的问题,我们可以在图像边缘填充像素,也就是 padding 操作了。   
                                           
   如果我们设置在图像边缘填充的像素数为p,那么经过卷积后的图像是:(n+2p-f+1)x(n+2p-f+1).    如何去选择p呢    通常有两种选择:   -Valid:也就是说不填充操作(no padding),因此如果我们有nxn的图像,fxf的过滤器,那么我们进行卷积nxn fxf=(n-f+1)x(n-f+1)的输出图像;   -Same:也就是填充后是输出图像的大小的与输入相同,同样就有(n+2p)x(n+2p) fxf=nxn,那么可以算,n+2p-f+1=n,得到p=(f-1)/2。   通常对于过滤器的选择有一个默认的准则就是选择过滤器的尺寸是奇数的过滤器。   - 卷积步长设置(Strided COnvolution)    卷积步长也就是我们进行卷积操作时,过滤器每次移动的步长,上面我们介绍的卷积操作步长默认都是1,也就是说每次移动过滤器时我们是向右移动一格,或者向下移动一格。   但是我们可以对卷积进行步长的设置,也就是我们能够对卷积移动的格数进行设置。同样假如我们的图像是nxn,过滤器是fxf,padding设置是p,步长strided设置为s,那么我们进行卷积操作后输出的图像为((n+2p-f)/s+1)x((n+2p-f)/s+1),那么这样就会出现一个问题,如果计算结果不是整数怎么办?   
                                           
   一般是选择向下取整,也就是说明,只有当我们的过滤器完全在图像上能够覆盖时才对它进行计算,这是一个惯例。    实际上上述所述的操作在严格数学角度来说不是卷积的定义,卷积的定义上我们计算的时候在移动步长之前也就是对应元素相乘之前是需要对卷积核或者说我们的过滤器进行镜像操作的,经过镜像操作后再把对应元素进行相乘这才是严格意义上的卷积操作,在数学角度上来说这个操作不算严格的卷积操作应该是属于互相关操作,但是在深度学习领域中,大家按照惯例都省略了反转操作,也把这个操作叫做卷积操作 
   我们知道彩色图像有RGB三个通道,因此对于输入来说是一个三维的输入,那么对三维输入的图像如何进行卷积操作呢?
                                           例子,如上图我们输入图像假设为6×6×3,3代表有RGB三个通道channel,或者可以叫depth深度,过滤器的选择为3×3×3,其中需要规定的是,顾虑器的channel必须与输入图像的channel相同,长宽没有限制,那么计算过程是,我们将过滤器的立体覆盖在输入,这样对应的27个数对应相乘后相加得到一个数,对应到我们的输出,因此这样的方式进行卷积后我们得出的输出层为4×4×1。如果我们有多个过滤器,比如我们分别用两个过滤器一个提取垂直特征,一个提取水平特征,那么输出图4×4×2 。也就是代表我们输出的深度或者说通道与过滤器的个数是相等的。
                                           第l层的卷积标记如下:
                                           加入我们的过滤器是3×3×3规格的,如果我们设定10个过滤器,那么需要学习的参数总数为每个过滤器为27个参数然后加上一个偏差bias那么每个过滤器的参数为28个,所以十个过滤器的参数为280个。从这里也就可以看出,不管我们输入的图片大小是多大,我们都只需要计算这些参数,因此参数共享也就很容易理解了。
                                           
                                           
   为了缩减模型的大小,提高计算速度,同时提高所提取特征的鲁棒性,我们经常会使用池化层。池化层的计算方式与卷积类似,只是我们需要对每一个通道都进行池化操作。   池化的方式一般有两种:Max Pooling和Average Pooling。
                                           上面为Max Pooling,那么计算方法与卷积类似,首先设定超参数比如过滤器的大小与步长,然后覆盖到对应格子上面,用最大值取代其值作为输出的结果,例如上图为过滤器选择2×2,步长选择为2,因此输出就是2×2的维度,每个输出格子都是过滤器对应维度上输入的最大值。如果为平均池化,那么就是选择其间的平均值作为输出的值。   因此从上面的过程我们看到,通过池化操作能够缩小模型,同时能让特征值更加明显,也就提高了提取特征的鲁棒性。
最新文章
热门文章
推荐阅读