卷积神经网络编程算法事例(卷积神经网络程序实现)

http://www.itjxue.com  2023-02-16 07:06  来源:未知  点击次数: 

一文看懂卷积神经网络-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(卷积神经网络)算法

基础知识讲解:

卷积:通过两个函数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.最后,根据梯度下降法则更新每个权重即可。

参考:

卷积神经网络结构——LeNet-5(卷积神经网络入门,Keras代码实现)

要深入理解卷积神经网络的结构,我们需要追根溯源,只有这样才能更好的理解 CNN 网络。

1998年 LeCun 和 Bengio 等人利用 LeNet-5 网络在手写体数字识别领域上的识别效果超过了传统方法,从此开启了卷积神经网络的在图像上的应用大门。据说,一开始美国银行的手写体数字识别就是用的这个算法。

Gradient -Based Learing Applied to Document Recognition

论文有点长,46页,估计很难读下来。

LeCun 做了一些网页展示,有兴趣可以去浏览。

上图是 LeCun 原论文中 LeNet-5 的结构图。

卷积神经网络的数学推导及简单实现

先来看一个网络:

这是一个简单的CNN的前半部分,不包含全连接层,而且已有一个卷积层和一个池化层,卷积核大小是2X2,步长1,Padding为0,Pooling操作为Max Pooling,大小同样是2x2

先来看正向的计算,卷积操作就没什么好说的了,不了解的可以随便百度一下,下面直接写公式:

是节点 的加权输入, 是激活函数ReLU

算出所有的 后,就是Max Pooling了:

卷积层和池化层的前向计算都说完了,虽然实际中一般不止一层,不过都是可以套用的,接下来就是全连接层了:

如图所示,max pooling的结果‘拉平’后就是全连接层的输入向量了:

这是之前的一篇关于DNN的推导,就不赘述了:

关于全连接层的误差传播已经知道怎么算了,接下来的问题就是将误差传回池化层及卷积层了:

上图中 是FC(全连接)层中输入层的误差,也是池化层的下一层的误差,公式在上面一篇文章中已经讨论了:

而输入层是没有激活函数的,所以 ,即:

在得到误差项之后,进一步求Pooling操作之前的误差项,如果Max Pooling如下:

则upsample操作则同样:

推导过程如下:

若x1为最大值,则不难求得下列偏导数:

因为只有最大的那一项会队x5产生影响,所以其余项的偏导数都为0,又因为:

,所以:

如下图所示:

池化层没有参数需要更新,所以只要把误差传给上一层就可以了,接下的问题就是已知卷积层的上一层(也就是正向计算的下一层)误差,求卷积层的误差以及更新卷积核了。

首先已知了上一层所有节点 的误差项 ,来看看如何更新卷积核的梯度。由于任一 都对所有 有影响,根据全导数公式:

上面已经讨论过 是节点 的加权输入,所以:

最后,就是把误差继续往上一层传递了,如图:

先看几个例子:

归纳一下,可以发现如下图的规律:

公式如下:

写成卷积形式:

总算写完了,只是后面的有些粗糙,以后有时间再完善吧

卷积神经网络算法是什么?

一维构筑、二维构筑、全卷积构筑。

卷积神经网络(Convolutional Neural Networks, CNN)是一类包含卷积计算且具有深度结构的前馈神经网络(Feedforward Neural Networks),是深度学习(deep learning)的代表算法之一。

卷积神经网络具有表征学习(representation learning)能力,能够按其阶层结构对输入信息进行平移不变分类(shift-invariant classification),因此也被称为“平移不变人工神经网络(Shift-Invariant Artificial Neural Networks, SIANN)”。

卷积神经网络的连接性:

卷积神经网络中卷积层间的连接被称为稀疏连接(sparse connection),即相比于前馈神经网络中的全连接,卷积层中的神经元仅与其相邻层的部分,而非全部神经元相连。具体地,卷积神经网络第l层特征图中的任意一个像素(神经元)都仅是l-1层中卷积核所定义的感受野内的像素的线性组合。

卷积神经网络的稀疏连接具有正则化的效果,提高了网络结构的稳定性和泛化能力,避免过度拟合,同时,稀疏连接减少了权重参数的总量,有利于神经网络的快速学习,和在计算时减少内存开销。

卷积神经网络中特征图同一通道内的所有像素共享一组卷积核权重系数,该性质被称为权重共享(weight sharing)。权重共享将卷积神经网络和其它包含局部连接结构的神经网络相区分,后者虽然使用了稀疏连接,但不同连接的权重是不同的。权重共享和稀疏连接一样,减少了卷积神经网络的参数总量,并具有正则化的效果。

在全连接网络视角下,卷积神经网络的稀疏连接和权重共享可以被视为两个无限强的先验(pirior),即一个隐含层神经元在其感受野之外的所有权重系数恒为0(但感受野可以在空间移动);且在一个通道内,所有神经元的权重系数相同。

卷积神经网络之GAN(附完整代码)

不管何种模型,其损失函数(Loss Function)选择,将影响到训练结果质量,是机器学习模型设计的重要部分。对于判别模型,损失函数是容易定义的,因为输出的目标相对简单。但对于生成模型,损失函数却是不容易定义的。

GAN算法原理:

1)G是一个生成图片的网络,它接收一个随机的噪声z,通过这个噪声生成图片,记做G(z)。

3)在最理想的状态下,G可以生成足以“以假乱真”的图片G(z)。对于D来说,它难以判定G生成的图片究竟是不是真实的,因此D(G(z)) = 0.5。

4)这样目的就达成了:得到了一个生成式的模型G,它可以用来生成图片。

在训练过程中,生成网络G的目标就是尽量生成真实的图片去欺骗判别网络D。而判别网络D的目标就是尽量把G生成的图片和真实的图片分别开来。这样,G和D构成了一个动态的“博弈过程”。

2.再以理论抽象进行说明:

GAN是一种通过对抗过程估计生成模型的新框架。框架中同时训练两个模型:捕获数据分布的生成模型G,和估计样本来自训练数据的概率的判别模型D。G的训练程序是将D错误的概率最大化。可以证明在任意函数G和D的空间中,存在唯一的解决方案,使得G重现训练数据分布,而D=0.5(D判断不出真假,50%概率,跟抛硬币决定一样)。在G和D由多层感知器定义的情况下,整个系统可以用反向传播进行训练。在训练或生成样本期间,不需要任何马尔科夫链或展开的近似推理网络。实验通过对生成的样品的定性和定量评估,证明了GAN框架的潜在优势。

Goodfellow从理论上证明了该算法的收敛性。在模型收敛时,生成数据和真实数据具有相同分布,从而保证了模型效果。

GAN公式形式如下:

1)公式中x表示真实图片,z表示输入G网络的噪声,G(z)表示G网络生成的图片;

2)D(x)表示D网络判断图片是否真实的概率,因为x就是真实的,所以对于D来说,这个值越接近1越好。

3)G的目的:D(G(z))是D网络判断G生成的图片的是否真实的概率。G应该希望自己生成的图片“越接近真实越好”。也就是说,G希望D(G(z))尽可能得大,这时V(D, G)会变小。因此公式的最前面记号是min_G。

4)D的目的:D的能力越强,D(x)应该越大,D(G(x))应该越小。这时V(D,G)会变大。因此式子对于D来说是求最大max_D。

GAN训练过程:

GAN通过随机梯度下降法来训练D和G。

1)首先训练D,D希望V(G, D)越大越好,所以是加上梯度(ascending)

2)然后训练G时,G希望V(G, D)越小越好,所以是减去梯度(descending);

GAN训练具体过程如下:

GAN算法优点:

1)使用了latent code,用以表达latent dimension、控制数据隐含关系等;

2)数据会逐渐统一;

3)不需要马尔可夫链;

4)被认为可以生成最好的样本(不过没法鉴定“好”与“不好”);

5)只有反向传播被用来获得梯度,学习期间不需要推理;

6)各种各样的功能可以被纳入到模型中;

7)可以表示非常尖锐,甚至退化的分布。

GAN算法缺点:

1)Pg(x)没有显式表示;

2)D在训练过程中必须与G同步良好;

3)G不能被训练太多;

4)波兹曼机必须在学习步骤之间保持最新。

GAN的应用范围较广,扩展性也强,可应用于图像生成、数据增强和图像处理等领域。

1)图像生成:

目前GAN最常使用的地方就是图像生成,如超分辨率任务,语义分割等。

2)数据增强:

用GAN生成的图像来做数据增强。主要解决的问题是a)对于小数据集,数据量不足,可以生成一些数据;b)用原始数据训练一个GAN,GAN生成的数据label不同类别。

GAN生成式对抗网络是一种深度学习模型,是近年来复杂分布上无监督学习最具有前景的方法之一,值得深入研究。GAN生成式对抗网络的模型至少包括两个模块:G模型-生成模型和D模型-判别模型。两者互相博弈学习产生相当好的输出结果。GAN算法应用范围较广,扩展性也强,可应用于图像生成、数据增强和图像处理等领域。

(责任编辑:IT教学网)

更多

推荐word文章