当前位置:   article > 正文

神经网络与卷积神经网络结构概述——神经网络入门_神经网络和卷积

神经网络和卷积

一、神经网络与卷积神经网络

这里我们构建一个两层神经网络,理论上两层神经网络已经可以拟合任意函数。这个神经网络的结构如下图:
在这里插入图片描述

首先去掉图1中一些难懂的东西,如下图:
在这里插入图片描述

1. 输入层

在例子中,输入层是坐标值,例如(1,1),这是一个包含两个元素的数组,也可以看作是一个 1×2 的矩阵。输入层的元素维度与输入量的特征息息相关,如果输入的是一张 32×32 像素的灰度图像,那么输入层的维度就是 32×32。

2. 从输入层到隐藏层

连接输入层和隐藏层的是 W1 和 b1。由X计算得到 H 十分简单,就是矩阵运算(在设定隐藏层为50维(也可以理解成50个神经元)之后,矩阵H的大小为(1×50)的矩阵):

H = X*W1+b1
3. 从隐藏层到输出层

连接隐藏层和输出层的是W2和b2。同样是通过矩阵运算进行的:

Y = H*W2+b2
4. 分析

通过上述两个线性方程的计算,就能得到最终的输出Y了,但是根据我们之前学过的线性代数可知:一系列线性方程的运算最终都可以用一个线性方程表示。也就是说,上述两个式子联立后可以用一个线性方程表达。对于两次神经网络是这样,就算网络深度加到100层,也依然是这样。这样的话神经网络就失去了意义。所以这里要对网络注入灵魂:激活层



二、激活层

简而言之,激活层是为矩阵运算的结果添加非线性的。常用的激活函数有三种,分别是阶跃函数、Sigmoid 和 ReLU。刚开始我是被这三个的奇奇怪怪的名字吓到了,其实它们的形式都很简单,如下图(sigmoid在负无穷是应趋近于0):

在这里插入图片描述

函数特点
阶跃函数当输入小于等于0时,输出0;当输入大于0时,输出1
Sigmoid当输入趋近于正无穷/负无穷时,输出无限接近于1/0
ReLU当输入小于0时,输出0;当输入大于0时,输出等于输入

其中,阶跃函数输出值是跳变的,且只有二值,较少使用;Sigmoid函数在当x的绝对值较大时,曲线的斜率变化很小(梯度消失),并且计算较复杂;ReLU是当前较为常用的激活函数

激活函数具体是怎么计算的呢?
假如经过公式 H=X*W1+b1 计算得到的H值为:(1,-2,3,-4,7…),那么经过阶跃函数激活层后就会变为(1,0,1,0,1…),经过ReLU激活层之后会变为(1,0,3,0,7…)。需要注意的是,每个隐藏层计算(矩阵线性运算)之后,都需要加一层激活层,要不然该层线性计算是没有意义的。

此时的神经网络变成了如下图所示的形式:
在这里插入图片描述

神经网络是分为 “训练” 和 “使用” 两个步骤的。如果是在 “使用” 的步骤,图4 就已经完成整个过程了,在求得的Y(大小为1×4)矩阵中,数值最大的就代表着当前分类。但是对于用于“训练”的网络,上图还远远不够。起码当前的输出Y,还不够“漂亮”。



三、输出的正规化

在上图中,输出Y的值可能会是 (3, 1, 0.1, 0.5) 这样的矩阵,诚然我们可以找到里边的最大值“3”,从而找到对应的分类为 I,但是这并不直观。我们想让最终的输出为概率,也就是说可以生成像 (90%, 5%, 2%, 3%) 这样的结果,这样做不仅可以找到最大概率的分类,而且可以知道各个分类计算的概率值。

计算公式如下:
在这里插入图片描述
简单来说分三步进行:
(1)以 e 为底对所有元素求指数幂;
(2)将所有指数幂求和;
(3)分别将这些指数幂与该和做商。

这样求出的结果中,所有元素的和一定为1,而每个元素可以代表概率值。

我们将使用这个计算公式做输出结果正规化处理的层叫做“Softmax”层。此时的神经网络将变成如下图所示:
在这里插入图片描述



四、如何衡量输出的好坏

通过 Softmax 层之后,我们得到了 I,II,III 和 IV 这四个类别分别对应的概率,但是要注意,这是神经网络计算得到的概率值结果,而非真实的情况。

比如,Softmax输出的结果是(90%,5%,3%,2%),真实的结果是(100%,0,0,0)。虽然输出的结果可以正确分类,但是与真实结果之间是有差距的,一个优秀的网络对结果的预测要无限接近于100%,为此,我们需要将Softmax输出结果的好坏程度做一个“量化”

一种直观的解决方法,是用 1 减去Softmax输出的概率,比如1 - 90%=0.1。不过更为常用且巧妙的方法是,求对数的负数

还是用90%举例,对数的负数就是:-log0.9=0.046

可以想见,概率越接近100%,该计算结果值越接近于0,说明结果越准确,该输出叫做 “ 交叉熵损失(Cross Entropy Error)”

我们训练神经网络的目的,就是尽可能地减少这个“交叉熵损失”。此时的网络如下图:

在这里插入图片描述
上面讲述了神经网络的正向传播过程。

一句话总结一下:
神经网络的传播都是形如 Y=WX+b 的矩阵运算;
为了给矩阵运算加入非线性,需要在隐藏层中加入激活层;
输出层结果需要经过Softmax层处理为概率值,并通过交叉熵损失来量化当前网络的优劣。

算出交叉熵损失后,就要开始反向传播了。其实反向传播就是一个参数优化的过程,优化对象就是网络中的所有 W 和 b(因为其他所有参数都是确定的)。

神经网络的神奇之处,就在于它可以自动做 W 和 b 的优化,在深度学习中,参数的数量有时会上亿,不过其优化的原理和我们这个两层神经网络是一样的。神经网络需要反复迭代。

如上述例子中,第一次计算得到的概率是90%,交叉熵损失值是0.046;将该损失值反向传播,使W1,b1,W2,b2做相应微调;再做第二次运算,此时的概率可能就会提高到92%,相应地,损失值也会下降,然后再反向传播损失值,微调参数W1,b1,W2,b2。依次类推,损失值越来越小,直到我们满意为止。

此时我们就得到了理想的W1,b1,W2,b2。

此时如果将任意一组坐标作为输入,利用图4或图5的流程,就能得到分类结果。



五、从神经网络到卷积神经网络CNN

神经网络的结构是这样的:
在这里插入图片描述
其实卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进。简而言之,卷积神经网络(Convolutional Neural Networks)是一种深度学习模型或类似于人工神经网络的多层感知器,常用来分析视觉图像。

在这里插入图片描述

如上图所示CNN的架构可知,卷积神经网络架构与常规人工神经网络架构非常相似,特别是在网络的最后一层,即全连接。此外,还注意到卷积神经网络能够接受多个特征图作为输入,而不是向量。


卷积神经网络的层级结构:

  1. 数据输入层/ Input layer
  2. 卷积计算层/ CONV layer
  3. ReLU激励层 / ReLU layer
  4. 池化层 / Pooling layer
  5. 全连接层 / FC layer
1. 数据输入层

该层要做的处理主要是对原始图像数据进行预处理,其中包括:
① 去均值: 把输入数据各个维度都中心化为0,如下图所示,其目的就是把样本的中心拉回到坐标系原点上。

② 归一化: 幅度归一化到同样的范围,如下所示,即减少各维度数据取值范围的差异而带来的干扰,比如,我们有两个维度的特征A和B,A范围是0到10,而B范围是0到10000,如果直接使用这两个特征是有问题的,好的做法就是归一化,即A和B的数据都变为0到1的范围。

③ PCA/白化: 用PCA降维;白化是对数据各个特征轴上的幅度归一。

========== 去均值与归一化效果图 ==========

在这里插入图片描述

========== 去相关与白化效果图 ==========
在这里插入图片描述

2.卷积计算层

这一层就是卷积神经网络最重要的一个层次,也是“卷积神经网络”的名字来源。在这个卷积层,有两个关键操作:

局部关联: 每个神经元看做一个滤波器( filter )

窗口(receptive field)滑动: filter 对局部数据计算举个例子,取 feature 里的(1,1)元素值,再取图像上蓝色框内的(1,1)元素值,二者相乘等于1。把这个结果1填入新的图中。

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

接下来的工作是对右图九个值求平均,得到一个均值,将均值填入一张新的图中。这张新的图我们称之为 feature map (特征图)

在这里插入图片描述

进行卷积对应相乘运算并求得均值后,滑动窗便开始向右边滑动。根据步长的不同选择滑动幅度。比如,若 步长 stride=1,就往右平移一个像素。

在这里插入图片描述

同样,若步长stride=1,向下平移一个像素;stride=2 则向下平移2个像素。

在这里插入图片描述
feature mapn 是每一个 feature 从原始图像中提取出来的“特征”。其中的值,越接近为1表示对应位置和feature的匹配越完整,越是接近-1,表示对应位置和 feature 的反面匹配越完整,而值接近 0 的表示对应位置没有任何匹配或者说没有什么关联。

一个feature作用于图片产生一张feature map,对这张X图来说,我们用的是3个feature,因此最终产生3个 feature map。

在这里插入图片描述

3. 非线性激活层

卷积层对原图运算多个卷积产生一组线性激活响应,而非线性激活层是对之前的结果进行一个非线性的激活响应。在神经网络中用到最多的非线性激活函数是Relu函数,它的公式定义如下:

f(x) = max(0,x)

即,保留大于等于0的值,其余所有小于0的数值直接改写为0

为什么要这么做呢? 上面说到,卷积后产生的特征图中的值,越靠近1表示与该特征越关联,越靠近-1表示越不关联,而我们进行特征提取时,为了使得数据更少,操作更方便,就直接舍弃掉那些不相关联的数据。

如下图所示:>=0的值不变,而<0的值一律改写为0

在这里插入图片描述

4.池化层

卷积操作后,我们得到了一张张有着不同值的feature map,尽管数据量比原图少了很多,但还是过于庞大(比较深度学习动不动就几十万张训练图片),因此接下来的池化操作就可以发挥作用了,它最大的目标就是减少数据量

池化分为两种,Max Pooling 最大池化、Average Pooling平均池化。 顾名思义,最大池化就是取最大值,平均池化就是取平均值。

拿最大池化举例:选择池化尺寸为2x2,因为选定一个2x2的窗口,在其内选出最大值更新进新的 feature map。

在这里插入图片描述
在这里插入图片描述

最终得到池化后的feature map。可明显发现数据量减少了很多。

因为最大池化保留了每一个小块内的最大值,所以它相当于保留了这一块最佳匹配结果(因为值越接近1表示匹配越好)。这也就意味着它不会具体关注窗口内到底是哪一个地方匹配了,而只关注是不是有某个地方匹配上了。这也就能够看出,CNN能够发现图像中是否具有某种特征,而不用在意到底在哪里具有这种特征。这也就能够帮助解决之前提到的计算机逐一像素匹配的死板做法。

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/笔触狂放9/article/detail/103930
推荐阅读
相关标签
  

闽ICP备14008679号