首页 > 编程知识 正文

cnn卷积神经网络的优点,多层卷积神经网络

时间:2023-05-03 11:02:46 阅读:160805 作者:2500

1、神经网络首先要了解神经网络,大家移动到这两个博客,一个是纯理论,一个是实战加理论。

机器学习的神经网络学习及其模型入门课:用numpy实现简单的神经网络(BP算法) 2、卷积神经网络的分层结构cs231n课程中卷积神经网络的分层结构如下图所示

上图中的CNN要做的事情是,不知道某个图像是车还是mmdxj,也不知道是什么车,现在需要通过模型判断这个图像具体拍到了什么。 总之,如果是车的话,会输出是什么车的结果

所以

最左边是数据输入层,进行消除平均值(将输入数据的各维度居中为0,避免数据过于偏重影响训练效果)、归一化(将所有数据汇总在同一个范围内)、PCA/白化等处理。 CNN对训练集只做了“取平均值”的步骤。

中间为CONV :卷积计算层,线性积和。 RELU :激发层,如上述2.2节所述,RELU是活性化函数的一种POOL :池化层,简单来说,取区域平均或最大

最右边的是FC :在所有连接层的几个部分中,卷积计算层是CNN的核心,现重点阐述如下。

3CNN的卷积计算层3.1 CNN怎么进行识别

简单来说,给定' x '图案时,计算机如何识别该图案为“x”呢? 一种可能的方式是,计算机保存标准的“x”图案,将需要识别的未知图案与标准的“x”图案进行比较,如果两者一致,则确定未知图案为“x”图案。

另外,即使未知图案稍微平行移动或稍微变形,也能够识别出其为x图案。 这样,CNN将未知图案与标准的x图案一一进行了局部对比,如下图所示

将未知图案的局部和标准的x图案的局部一一对照时的计算过程是卷积操作。 卷积计算结果为1时一致,否则不一致。

具体而言,为了确定图像中是否包含“x”或“o”,需要确定是否包含“x”或“o”并假设需要选择某一个而不是“x”或“o”

理想的状况如下。

标准的“x”和“o”字符位于图像的中间,没有按适当的比例变形

对计算机来说,解决这个问题并不容易,除非图像有点奇怪和标准。

为了解决上述问题,计算机保留“x”和“o”标准图像,然后将其他新给定的图像与这两幅标准图像进行比较,看它们与哪个图像更匹配,然后判断是哪个字符,这是一种天真的方法,如前例所示。

但这样做的话,计算机还很死板,实际上非常不可靠。 在计算机的“视觉”中,图看起来像二维像素阵列,每个位置都有一个数字对应。 在这个例子中,像素值'1'表示白色,而像素值'-1 '表示黑色。

比较两幅图时,如果其中一个像素值不一致,这两幅图就不一致。 至少对计算机来说是这样。

在本例中,计算机认为其他四个角不同,除了上述两幅图中的白色像素在中央3*3的yjdym中是相同的。

因此,从表面上看,计算机判别出右图不是“x”,两幅图不同,得出了结论:

但这样做,太不合理了。 理想情况下,希望计算机即使对只进行了平移、缩放、旋转、微变形等简单变换的图像也能识别图中的' x '和' o '。 正如以下情况,我们仍然希望计算机能够快速准确地识别。

这就是CNN要解决的问题。

功能

对CNN来说,那是一个一个对照。 我们把这个与之进行比较的“小块”称为Features (特征)。 通过在两图几乎相同的位置找到几个粗糙的特征并进行匹配,CNN可以更好地看到两图的相似性,比传统的一个整体图进行对照的方法更好。

每个feature都像一个小图。 是有比较小值的二维数组。 不同的Feature匹配图像中的不同特征。 在字母' x '的例子中,由对角线和交叉线构成的features基本上可以识别出很多' x '所具有的重要特征。

这些features很可能与包含“x”这个文字的图的文字x的四个角及其中心一致。 那么具体是怎么匹配的呢? 如下所示。

看到这里不是有点领导了吗? 但其实这只是第一步,我知道这些Features是如何在原图上一致的。 但是,我不知道这里面进行了什么样的数学计算。 例如,这下面的3*3小块到底做了什么?

其中的数学操作是常说的“卷积”操作。 接下来,我们来理解什么是卷积操作。

3.2 什么是卷积

影像(不同数据窗口数据)和滤波矩阵)一组固定权重:由于各神经元多个权重固定,又可视为固定的滤波滤波器内积)操作即所谓的“卷积”操作

不是严格意义上的,下图中被红框包围的部分可以理解为具有固定权重的一组神经元的滤波器。 多个过滤器重叠在一起就是卷积层。

OK,举个具体的例子吧。 例如,在下图中,图中左部分为原始输入数据,图中中央部分为过滤器filter,图中右部分为输出的新二维数据。

中间滤波器与数据窗口取内积,具体计算过程为40 00 00 00 01 01

+ 00 + 01 + -4*2 = -8

3.3 图像上的卷积

在下图对应的计算过程中,输入是一定区域大小(width*height)的数据,和滤波器filter(带着一组固定权重的神经元)做内积后等到新的二维数据。

具体来说,左边是图像输入,中间部分就是滤波器filter(带着一组固定权重的神经元),不同的滤波器filter会得到不同的输出数据,比如颜色深浅、轮廓。相当于如果想提取图像的不同特征,则用不同的滤波器filter,提取想要的关于图像的特定信息:颜色深浅或轮廓。

如下图所示

3.4 GIF动态卷积图
在CNN中,滤波器filter(带着一组固定权重的神经元)对局部输入数据进行卷积计算。每计算完一个数据窗口内的局部数据后,数据窗口不断平移滑动,直到计算完所有数据。这个过程中,有这么几个参数:

a. 深度depth:神经元个数,决定输出的depth厚度。同时代表滤波器个数。

b. 步长stride:决定滑动多少步可以到边缘。

c.填充值zero-padding:在外围边缘补充若干圈0,方便从初始位置以步长为单位可以刚好滑倒末尾位置,通俗地讲就是为了总长能被步长整除。

cs231n课程中有一张卷积动图,貌似是用d3js 和一个util 画的,我根据cs231n的卷积动图依次截取了18张图,然后用一gif 制图工具制作了一gif 动态卷积图。如下gif 图所示
可以看到:

两个神经元,即depth=2,意味着有两个滤波器。

数据窗口每次移动两个步长取3*3的局部数据,即stride=2。

zero-padding=1。

然后分别以两个滤波器filter为轴滑动数组进行卷积计算,得到两组不同的结果。

如果初看上图,可能不一定能立马理解啥意思,但结合上文的内容后,理解这个动图已经不是很困难的事情:

左边是输入(773中,7*7代表图像的像素/长宽,3代表R、G、B 三个颜色通道)

中间部分是两个不同的滤波器Filter w0、Filter w1

最右边则是两个不同的输出

随着左边数据窗口的平移滑动,滤波器Filter w0 / Filter w1对不同的局部数据进行卷积计算。

值得一提的是:

左边数据在变化,每次滤波器都是针对某一局部的数据窗口进行卷积,这就是所谓的CNN中的局部感知机制。

打个比方,滤波器就像一双眼睛,人类视角有限,一眼望去,只能看到这世界的局部。如果一眼就看到全世界,你会累死,而且一下子接受全世界所有信息,你大脑接收不过来。当然,即便是看局部,针对局部里的信息人类双眼也是有偏重、偏好的。比如看mrdy,对脸、胸、腿是重点关注,所以这3个输入的权重相对较大。

与此同时,数据窗口滑动,导致输入在变化,但中间滤波器Filter w0的权重(即每个神经元连接数据窗口的权重)是固定不变的,这个权重不变即所谓的CNN中的参数(权重)共享机制。

再打个比方,某人环游全世界,所看到的信息在变,但采集信息的双眼不变。btw,不同人的双眼 看同一个局部信息
所感受到的不同,即一千个读者有一千个wrdyx,所以不同的滤波器 就像不同的双眼,不同的人有着不同的反馈结果。

我第一次看到上面这个动态图的时候,只觉得很炫,另外就是据说计算过程是“相乘后相加”,但到底具体是个怎么相乘后相加的计算过程
则无法一眼看出,网上也没有一目了然的计算过程。本文来细究下。

首先,我们来分解下上述动图,如下图
接着,我们细究下上图的具体计算过程。即上图中的输出结果1具体是怎么计算得到的呢?其实,类似wx + b,w对应滤波器Filter w0,x对应不同的数据窗口,b对应Bias b0,相当于滤波器Filter w0与一个个数据窗口相乘再求和后,最后加上Bias b0得到输出结果1,如下过程所示:







然后滤波器Filter w0固定不变,数据窗口向右移动2步,继续做内积计算,得到0的输出结果
最后,换做另外一个不同的滤波器Filter w1、不同的偏置Bias b1,再跟图中最左边的数据窗口做卷积,可得到另外一个不同的输出。

4 CNN之激励层,池化层,全连接层

4.1 ReLU激励层
第一节俩篇博客介绍了激活函数sigmoid,但实际梯度下降中,sigmoid容易饱和、造成终止梯度传递,且没有0中心化。咋办呢,可以尝试另外一个激活函数:ReLU,其图形表示如下
对于输入的负值,输出全为0,对于正值,原样输出。

下面我们看一下本文的离例子中relu激活函数具体操作:


最后,我们将上面所提到的卷积,池化,激活放在一起,就是下面这个样子:然后,我们加大网络的深度,增加更多的层,就得到深度神经网络了:

4.2 池化pool层
前头说了,池化,简言之,即取区域平均或最大,如下图所示(图引自cs231n)
CNN中使用的另一个有效的工具被称为“池化(Pooling)”。池化可以将一幅大的图像缩小,同时又保留其中的重要信息。池化背后的数学顶多也就是小学二年级水平。它就是将输入图像进行缩小,减少像素信息,只保留重要信息。通常情况下,池化都是22大小,比如对于max-pooling来说,就是取输入图像中22大小的块中的最大值,作为结果的像素值,相当于将原始图像缩小了4倍。(注:同理,对于average-pooling来说,就是取2*2大小块的平均值作为结果的像素值。)

上图所展示的是取区域最大,即上图左边部分中 左上角2x2的矩阵中6最大,右上角2x2的矩阵中8最大,左下角2x2的矩阵中3最大,右下角2x2的矩阵中4最大,所以得到上图右边部分的结果:6 8 3 4。很简单不是?

4.3全连接层(Fully connected layers)

根据结果判定为"X":
在这个过程中,我们定义这一系列操作为”全连接层“(Fully connected layers):
全连接层也能够有很多个,如下:
【综合上述所有结构】

5 综合演练

参数
f:过滤器大小
s:步长


6 注:

本博客参考自:
v_JULY_v
dsdtk卷积神经网络
zhwhong

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。