神经网络及深度学习CNN

一、传统人工神经网络(ANN)

传统的人工神经网络由三层组成:输入层、隐藏层、输出层。每一层是由一个个神经元组成。每个连接线对应一个不同的权重(其值称为权值),这是需要训练得到的。
在这里插入图片描述
在这里插入图片描述
除了输入层,每一层的节点都包含一个非线性变换。而非线性化则需要激活函数。

在这里插入图片描述
在这里插入图片描述
多层带来的问题就是复杂度过高导致过拟合,因此要进行正则化。
在这里插入图片描述
在这里插入图片描述
反向传播算法(bp)
在这里插入图片描述
在这里插入图片描述
算法过程略。

二、CNN

在人工的全连接神经网络中,每相邻两层之间的每个神经元之间都是有边相连的。当输入层的特征维度变得很高时,这时全连接网络需要训练的参数就会增大很多,计算速度就会变得很慢,例如一张黑白的 28×28 的手写数字图片,输入层的神经元就有784个。

若在中间只使用一层隐藏层,参数 w 就有 784×15=11760 多个;若输入的是28×28 带有颜色的RGB格式的手写数字图片,输入神经元就有28×28×3=2352 个…… 。这很容易看出使用全连接神经网络处理图像中的需要训练参数过多的问题。

而在卷积神经网络(Convolutional Neural Network,CNN)中,卷积层的神经元只与前一层的部分神经元节点相连,即它的神经元间的连接是非全连接的,且同一层中某些神经元之间的连接的权重 w 和偏移 b 是共享的(即相同的),这样大量地减少了需要训练参数的数量。

1、CNN层次

卷积神经网络CNN的结构一般包含这几个层:

  • 输入层:用于数据的输入
  • 卷积层:使用卷积核进行特征提取和特征映射(提取特征)
  • 激励层:由于卷积也是一种线性运算,因此需要增加非线性映射
  • 池化层:进行下采样,对特征图稀疏处理,减少数据运算量。(降维,防止过拟合)
  • 全连接层:通常在CNN的尾部进行重新拟合,减少特征信息的损失
  • 输出层:用于输出结果

当然中间还可以使用一些其他的功能层:

  • 归一化层(Batch Normalization):在CNN中对特征的归一化
  • 切分层:对某些(图片)数据的进行分区域的单独学习
  • 融合层:对独立进行特征学习的分支进行融合

1.1 输入层

CNN的输入层的输入格式保留了图片本身的结构。对于一个RGB格式的32x32的图片,CNN输入的是3x32x32的神经元。
在这里插入图片描述
在这里插入图片描述

1.2 卷积层

需要明确的几个概念:

  • 感受野( local receptive fields)
    即感受上一层的部分特征。在卷积神经网络中,隐藏层中的神经元的感受视野比较小,只能看到上一次的部分特征,上一层的其他特征可以通过平移感受视野来得到同一层的其他神经元。

  • 卷积核
    感受视野中的权重矩阵

  • 共享权值(shared weights)

  • 步长(stride)
    感受视野对输入的扫描间隔称为步长(stride)

  • 边界扩充(pad)
    当步长比较大时(stride>1),为了扫描到边缘的一些特征,感受视野可能会“出界”,这时需要对边界扩充(pad)

  • 特征映射图(feature map)
    通过一个带有卷积核的感受视野 扫描生成的下一层神经元矩阵 称为一个特征映射图(feature map)
    在这里插入图片描述

在这里插入图片描述
这里举的例子是一个输入图片(553),卷积核(333),有两个(Filter W0,W1),偏置b也有两个(Bios b0,b1),卷积结果Output Volumn(332),步长stride = 2。

输入:773 是因为 pad = 1 (在图片边界行和列都补零,补零的行和的数目是1),

(对于彩色图片,一般都是RGB3种颜色,号称3通道,7*7指图片高h * 宽w)

,补零的作用是能够提取图片边界的特征。

卷积核深度为什么要设置成3呢?这是因为输入是3通道,所以卷积核深度必须与输入的深度相同。至于卷积核宽w,高h则是可以变化的,但是宽高必须相等。

卷积核输出o[0,0,0] = 3 (Output Volumn下浅绿色框结果),这个结果是如何得到的呢? 其实关键就是矩阵对应位置相乘再相加(千万不要跟矩阵乘法搞混淆啦)

=> w0[:,:,0] * x[:,:,0]蓝色区域矩阵(R通道) + w0[:,:,1] * x[:,:,1]蓝色区域矩阵(G通道)+ w0[:,:,2] * x[:,:,2]蓝色区域矩阵(B通道) + b0(千万不能丢,因为 y = w * x + b)

第一项 => 0 * 1 + 0 * 1 + 0 * 1 + 0 * (-1) + 1 * (-1) + 1 * 0 + 0 * (-1) + 1 * 1 + 1 * 0 = 0

第二项 => 0 * (-1) + 0 * (-1) + 0 * 1 + 0 * (-1) + 0 * 1 + 1 * 0 + 0 * (-1) + 2 * 1 + 2 * 0 = 2

第三项 => 0 * 1 + 0 * 0 + 0 * (-1) + 0 * 0 + 2 * 0 + 2 * 0 + 0 * 1 + 0 * (-1) + 0 * (-1) = 0

卷积核输出o[0,0,0] = > 第一项 + 第二项 + 第三项 + b0 = 0 + 2 + 0 + 1 = 3

o[0,0,1] = -5 又是如何得到的呢?

因为这里的stride = 2 ,所以 输入的窗口就要滑动两个步长,也就是红色框的区域,而运算跟之前是一样的

第一项 => 0 * 1 + 0 * 1 + 0 * 1 + 1 * (-1) + 2 * (-1) + 2 * 0 + 1 * (-1) + 1 * 1 + 2 * 0 = -3

第二项 => 0 * (-1) + 0 * (-1) + 0 * 1 + 1 * (-1) + 2 * 1 + 0 * 0 + 2 * (-1) + 1 * 1 + 1 * 0 = 0

第三项 => 0 * 1 + 0 * 0 + 0 * (-1) + 2 * 0 + 0 * 0 + 1 * 0 + 0 * 1 + 2 * (-1) + 1 * (-1) = - 3

卷积核输出o[0,0,1] = > 第一项 + 第二项 + 第三项 + b0 = (-3) + 0 + (-3) + 1 = -5

之后以此卷积核窗口大小在输入图片上滑动,卷积求出结果,因为有两个卷积核,所有就有两个输出结果。

这里小伙伴可能有个疑问,输出窗口是如何得到的呢?

这里有一个公式:输出窗口宽 w = (输入窗口宽 w - 卷积核宽 w + 2 * pad)/stride + 1 ,输出高 h = 输出窗口宽 w

以上面例子, 输出窗口宽 w = ( 5 - 3 + 2 * 1)/2 + 1 = 3 ,则输出窗口大小为 3 * 3,因为有2个输出,所以是 332。
在这里插入图片描述

在这里插入图片描述
一个感受视野带有一个卷积核,我们将 感受视野 中的权重 w 矩阵称为 卷积核 ;将感受视野对输入的扫描间隔称为步长(stride);当步长比较大时(stride>1),为了扫描到边缘的一些特征,感受视野可能会“出界”,这时需要对边界扩充(pad),边界扩充可以设为 0 或 其他值。步长 和 边界扩充值的大小由用户来定义。

卷积核的大小由用户来定义,即定义的感受视野的大小;卷积核的权重矩阵的值,便是卷积神经网络的参数,为了有一个偏移项 ,卷积核可附带一个偏移项 b ,它们的初值可以随机来生成,可通过训练进行变化。

我们将通过 一个带有卷积核的感受视野 扫描生成的下一层神经元矩阵 称为 一个feature map (特征映射图)
在这里插入图片描述
在同一个 feature map 上的神经元使用的卷积核是相同的,因此这些神经元 shared weights,共享卷积核中的权值和附带的偏移。一个 feature map 对应 一个卷积核,若我们使用 3 个不同的卷积核,可以输出3个feature map:(感受野:5×5,步长stride:1)
在这里插入图片描述

1.3 激励层

激励层主要对卷积层的输出进行一个非线性映射,因为卷积层的计算还是一种线性计算。使用的激励函数一般为ReLu函数。

  • 为什么要用ReLU函数?

由 y = w * x + b 可知,如果不用激活函数,每个网络层的输出都是一种线性输出,而我们所处的现实场景,其实更多的是各种非线性的分布。

这也说明了激活函数的作用是将线性分布转化为非线性分布,能更逼近我们的真实场景。
在这里插入图片描述

  • 为什么用ReLU函数而不用sigmoid函数?

他们在 x -> 时,输出就变成了恒定值,因为求梯度时需要对函数求一阶偏导数,而不论是sigmoid,还是tanhx,他们的偏导都为0,也就是存在所谓的梯度消失问题,最终也就会导致权重参数w , b 无法更新。相比之下,Relu就不存在这样的问题,另外在 x > 0 时,Relu求导 = 1,这对于反向传播计算dw,db,是能够大大的简化运算的。

使用sigmoid还会存在梯度爆炸的问题,比如在进行前向传播和反向传播迭代次数非常多的情况下,sigmoid因为是指数函数,其结果中某些值会在迭代中累积,并成指数级增长,最终会出现NaN而导致溢出。
在这里插入图片描述

1.4 池化层

在这里插入图片描述

池化层一般在卷积层+ Relu之后,它的作用是:

1、减小输入矩阵的大小(只是宽和高,而不是深度),提取主要特征。(不可否认的是,在池化后,特征会有一定的损失,所以,有些经典模型就去掉了池化这一层)。

它的目的是显而易见的,就是在后续操作时能降低运算。

2、一般采用mean_pooling(均值池化)和max_pooling(最大值池化),对于输入矩阵有translation(平移),rotation(旋转),能够保证特征的不变性。

mean_pooling 就是输入矩阵池化区域求均值,这里要注意的是池化窗口在输入矩阵滑动的步长跟stride有关,一般stride = 2.
在这里插入图片描述
max_pooling 最大值池化,就是每个池化区域的最大值放在输出对应位置上。
在这里插入图片描述

1.4 全连接层

全连接层主要对特征进行重新拟合,减少特征信息的丢失;输出层主要准备做好最后目标结果的输出。例如VGG的结构图,如下图所示:

1.5 归一化层

  • Batch Normalization

Batch Normalization(批量归一化)实现了在神经网络层的中间进行预处理的操作,即在上一层的输入归一化处理后再进入网络的下一层,这样可有效地防止“梯度弥散”,加速网络训练。
Batch Normalization具体的算法如下图所示:
在这里插入图片描述
每次训练时,取 batch_size 大小的样本进行训练,在BN层中,将一个神经元看作一个特征,batch_size 个样本在某个特征维度会有 batch_size 个值,然后在每个神经元 xi 维度上的进行这些样本的均值和方差,通过公式得到 xi∧,再通过参数 γ 和 β 进行线性映射得到每个神经元对应的输出 yi 。在BN层中,可以看出每一个神经元维度上,都会有一个参数 γ 和 β ,它们同权重w一样可以通过训练进行优化。

在卷积神经网络中进行批量归一化时,一般对 未进行ReLu激活的 feature map进行批量归一化,输出后再作为激励层的输入,可达到调整激励函数偏导的作用。

一种做法是将 feature map 中的神经元作为特征维度,参数 γ 和 β 的数量和则等于 2×fmapwidth×fmaplength×fmapnum,这样做的话参数的数量会变得很多;

另一种做法是把 一个 feature map 看做一个特征维度,一个 feature map 上的神经元共享这个 feature map的 参数 γ 和 β ,参数 γ 和 β 的数量和则等于 2×fmapnum,计算均值和方差则在batch_size个训练样本在每一个feature map维度上的均值和方差。

注:fmapnum指的是一个样本的feature map数量,feature map 跟神经元一样也有一定的排列顺序。

Batch Normalization 算法的训练过程和测试过程的区别:

在训练过程中,我们每次都会将 batch_size 数目大小的训练样本 放入到CNN网络中进行训练,在BN层中自然可以得到计算输出所需要的 均值 和 方差 ;

而在测试过程中,我们往往只会向CNN网络中输入一个测试样本,这是在BN层计算的均值和方差会均为 0,因为只有一个样本输入,因此BN层的输入也会出现很大的问题,从而导致CNN网络输出的错误。所以在测试过程中,我们需要借助训练集中所有样本在BN层归一化时每个维度上的均值和方差,当然为了计算方便,我们可以在 batch_num 次训练过程中,将每一次在BN层归一化时每个维度上的均值和方差进行相加,最后再进行求一次均值即可。

  • Local Response Normalization

近邻归一化(Local Response Normalization)的归一化方法主要发生在不同的相邻的卷积核(经过ReLu之后)的输出之间,即输入是发生在不同的经过ReLu之后的 feature map 中。

LRN的公式如下:

b(i,x,y)=a(i,x,y)(k+α∑min(N−1,i+n/2)j=max(0,i−n/2)a(j,x,y)2) β

其中:
a(i,x,y) 表示第i个卷积核的输出(经过ReLu层)的feature map上的 (x,y) 位置上的值。
b(i,x,y) 表示 a(i,x,y) 经LRN后的输出。
N 表示卷积核的数量,即输入的 feature map的个数。
n 表示近邻的卷积核(或feature map)个数,由自己来决定。
k,α,β是超参数,由用户自己调整或决定。

与BN的区别:BN依据mini batch的数据,近邻归一仅需要自己来决定,BN训练中有学习参数;BN归一化主要发生在不同的样本之间,LRN归一化主要发生在不同的卷积核的输出之间。

2、CNN的应用场景

卷积神经网络的应用不可谓不广泛,主要有两大类,数据预测和图片处理。数据预测自然不需要多说,图片处理主要包含有图像分类,检测,识别,以及分割方面的应用。

  • 图像分类:场景分类,目标分类

  • 图像检测:显著性检测,物体检测,语义检测等等

  • 图像识别:人脸识别,字符识别,车牌识别,行为识别,步态识别等等

  • 图像分割:前景分割,语义分割


参考:

猜你喜欢

转载自blog.csdn.net/Mason_Chen/article/details/110305156