卷积神经网络CNN
文章目录
1.定义
简单来说,就是包含了卷积层的神经网络。
2. 基础知识
2.1 神经元
神经元是构成神经网络的基础。
神经元接受来自其他n个神经元的输入信号
x
x
x,这些信号通过带有权重
w
w
w的连接传递到神经元。
这些输入与权重和阀值θ进行计算,并且输入到激活函数
f
f
f 中,激活函数根据计算值来决定输出
y
y
y。
把许多个这样的神经元按一定的层次结构连接起来,就得到了神经网络。
2.2 激活函数
引入激活函数是为了引入非线性因素,使其具备解决非线性问题的能力,激活函数必须是非线性的。神经元的计算过程是线性的,通过激活函数进行非线性转换。
理想中的激活函数是下图的阶跃函数,将输入值映射为0或1,0代表神经元活跃,1代表神经元兴奋。但这个函数具有不连续、不光滑的缺点。
常用的激活函数有Sigmoid函数与ReLU函数:
2.3 感知机
感知机是由两层神经元构成,如图所示。输入层接收来自外界的输入,输出层根据输入、权重与激活函数来计算输出:
y
=
f
(
∑
w
i
x
i
−
θ
)
y=f(∑w_ix_i-θ)
y=f(∑wixi−θ)。感知机中只有输出层神经元进行激活函数处理。
只有单层的感知机只能进行二分类任务,也就是存在只使用一个线性超平面就能将数据分类,如单层感知机可以处理’与’、‘或’,'非’操作。一旦要数据分为多类就无法处理,如异或,它不是线性可分的,是非线性的,需要将数据分为多个类。
2.4 多层感知机 MLP
要实现多分类任务,可以使用多层感知机,也就是在输入层与输出层之间加入隐层或隐含层(hidden layer)。结构如图所示,称为 “多层前馈网络”,其中隐含层的层数与隐含层的大小都是超参数。
每层神经元与下一层的神经元全连接,神经元之间不存在同层或跨层连接。
输入层只是接收输入,不能进行函数处理。隐含层与输出层都是拥有激活函数的神经元,会对信号进行加工。
神经网络的学习过程就是根据训练数据来调整神经元之间的权重以及每个神经元的阈值。
2.5 Softmax函数
softmax函数又称归一化指数函数,是基于 sigmoid 二分类函数在多分类任务上的推广。
在多分类网络中,常用softmax来对输出层的输出进行分类。
公式如下,对于每个输出结果会进行e的幂次运算。
使用e的幂函数来实现二极化,使正样本(正数)的结果趋近于 1,使负样本(负数)的结果趋近于 0;且样本的绝对值越大,两极化越明显。
具体使用如图所示,使用Softmax使得输出符合一个概率分布。
经过Softmax处理后所有输出节点的概率之和为1。
2.6 交叉熵损失 Cross Entropy Loss
交叉熵通常用于衡量两个概率的区别
2.6 BP算法 误差逆传播算法
用于训练神经网络。
包含信号的前向传播与误差的反向传播,流程如下:
- 将数据输入到输入层神经元,然后信号前向逐层传播,直到输出层输出结果。
- 计算输出层的结果与预期结果之间的误差,再将误差逆向传播到隐含层的神经元。
- 隐含层的神经元根据误差调整权重与阈值。
- 不断迭代,直到误差符合要求。
2.7 全连接网络
上面所提到的网络结构中,上下层之间的神经元是全连接。这种全连接网络在遇到大数据时,储存参数所需的空间很大。
如一张12Million像素的RGB图片包含36Milion个元素,在单隐含层网络中,若隐含层包含100个神经元,由于是全连接,则至少需要3600Million个权重,存储这些至少需要14GB。
3. 卷积层
卷积层中,卷积核代替了神经元,卷积核对输入数据进行卷积操作,目的是为了提取特征。
卷积层中的卷积操作保证了神经网络的平移不变性与局部性:
- 平移不变性:识别器的识别结果不应因为像素的平移而发生改变,一个物体经过平移,识别器应能识别出来。
- 局部性:只需要局部的信息就可以,不需要全局的信息。
优势:
与之前的全连接网络中,需要使用大量的参数而且输入不同的数据时这些参数都要发生改变相比,卷积层中只需要设置各个卷积核中的参数,而且训练好后卷积核的参数是固定的,不同的输入所使用的卷积核是一样的。
对于上面的情况,隐含层中包含100个5x5的卷积核,只需要设置5x5x100=2500个参数即可,而且训练好后不会应该输入的变化而改变。
3.1 卷积操作
卷积操作的目的是为了提取图像的特征,需要使用**卷积核(Convolution Kernel)**来进行计算。
卷积操作是指将一个可移动的小窗口(称为数据窗口,也就是卷积核)与图像进行逐元素相乘然后相加的操作。这个小窗口其实是一组固定的权重,它可以被看作是一个卷积核。计算如图所示:
卷积操作的动图如图所示,可以看到卷积核在不断的移动与计算,得到卷积结果。(bias为偏移)
3.2 卷积的步长
卷积窗口从输入矩阵的最左上方开始,按从左往右、从上往下的顺序,依次在输入矩阵上滑动。每次滑动的行数与列数为卷积的步长。
上图所示的卷积过程,其步长为2,每次滑动2行或2列。
注意,行列的步长可以单独设置,不一定要一样。
3.3 卷积的填充 padding
在卷积过程中,矩阵的边缘区域被计算的次数会少于中间区域,这样会到边缘区域的特征丢失。如图所示,边缘区域被计算的少。
而且,可能会存在卷积核的涵盖范围超过了输入矩阵大小的情况,如图所示,因此需要对输入矩阵进行填充。
填充操作称为padding,在矩阵旁边增加多圈为0的数据,padding为超参数:
padding=1时,增加一圈
padding=2时,增加两圈:
3.4 卷积的输出
所需参数:
- 输入 X X X: n h ∗ n w n_h*n_w nh∗nw
- 卷积核 W W W: k h ∗ k w k_h*k_w kh∗kw
- 偏差 b b b
- 步长 S S S
- 填充 p p p
输出
Y
Y
Y:经过卷积的数据。
Y
=
X
∗
W
+
b
Y=X*W+b
Y=X∗W+b
其中W与b时可以学习的参数,S与p为超参数。
3.5 卷积层的深度
卷积层的深度为其所包含的卷积核的个数,有多少个卷积核,就有多少个特征图。
3.6 多个输入通道
当图像包含多个输入通道时,需要每个通道都有对应一个卷积核,不同卷积核之间可能不同。
卷积层的深度与图像的通道数是一样的。
卷积的结果是所有通道的卷积结果之和,输出一个单通道的结果。
而运算公式如图所示:
3.7 多个输出通道
通过使用多个三维卷积核来实现,每个卷积核生成一个输出通道
4. 池化层
在卷积神经网络中,可能会包含多个卷积核,也就是会产生多个特征图。当特征图很多时,会有很多特征。但这些特征中并不全部都需要,而且多余的特征会导致 维度爆炸 与 过拟合 的问题。
池化层可以解决这个问题,池化层又称为下采样,将得到的特征图再次进行特征提取,进行稀疏处理,将其中最具有代表性的特征提取出来,可以起到减小过拟合和降低维度的作用。
4.1 池化操作的过程
池化操作与卷积操作的运行过程有相似的地方,都是使用一个正方形的小方块在图片上进行移动,每次我们取这个正方形方框中最具有代表性的特征。
而挑选最具代表性的特征的常用方法有两种:
① 最大池化层:选择方框中的最大值。
② 平均池化层:计算方框中的平均值并作为最具代表性的特征。
4.2 池化层中的参数
- kernel_size:方框的大小
- stride:步长
- padding:填充的大小
这些参数都是超参数,没有训练参数。一般padding与stride是相同的
4.3 通道
池化层中,输入通道=输出通道。
每个输入通道应用池化层以获得相应的输出通道。
5. BP算法中误差反向传播
BP算法是基于梯度下降的策略,利用损失梯度来更新权重,反向传播的过程中,需要使用到损失
L
O
S
S
LOSS
LOSS与需要更新的旧权重
w
(
o
l
d
)
w(old)
w(old)来计算损失梯度:
Δ
w
(
o
l
d
)
=
∂
L
O
S
S
∂
w
(
o
l
d
)
\Delta w(old)= \frac{\partial LOSS}{\partial w(old)}
Δw(old)=∂w(old)∂LOSS。
然后使用损失梯度以及设定好的学习率
η
\eta
η得到新的权重:
w
(
n
e
w
)
=
w
(
o
l
d
)
−
η
∗
Δ
w
(
o
l
d
)
w(new)=w(old)-\eta*\Delta w(old)
w(new)=w(old)−η∗Δw(old)
5.1 反向传播的过程
下面将以下图的网络结构来执行整个反向传播的过程。激活函数为Softmax函数
其中y1与y2的值如图所示:
① 损失计算:
在BP网络中,使用交叉熵损失(Softmax版) 来作为误差。损失
L
O
S
S
LOSS
LOSS计算公式如下:
因此损失
L
O
S
S
=
−
(
o
1
∗
log
(
o
1
)
+
o
2
∗
log
(
o
2
)
)
LOSS=-\left(o_{1}^{*} \log \left(o_{1}\right)+o_{2}^{*} \log \left(o_{2}\right)\right)
LOSS=−(o1∗log(o1)+o2∗log(o2))
② 损失梯度计算
这里以
w
11
(
2
)
w^{(2)}_{11}
w11(2)为例进行计算梯度:由于y1与O1和O2有关系,因此将它们拆分。
然后计算里面的各个偏导数:
将运算后得到的导数带入损失梯度的计算中,得到了损失梯度
③ 权重更新:
根据
w
(
n
e
w
)
=
w
(
o
l
d
)
−
η
∗
Δ
w
(
o
l
d
)
w(new)=w(old)-\eta*\Delta w(old)
w(new)=w(old)−η∗Δw(old)来更新权重。
迭代更新参数,使得误差得到一个全局最小。
5.2 分批次更新
在实际应用中,往往不可能一次将全部数据都载入内存,只能分批次进行训练。
使用整个样本求解损失梯度时,它会指向全局最优的方向。
而分批次时,计算损失梯度时指向当前批次最优的方向,也就是一个局部最优。
由下图可知,分批次的训练过程不够平稳,会有振荡,此时需要使用优化器(optimazer)。
① SGD优化器:
这种优化器也就是将原始的权重更新公式使用到各个批次中。
权重会沿着损失梯度的方向移动来更新。
缺点:
- 可能会陷入局部最优解
- 容易受到噪声的影响,导致振荡
② SGD + Momentum优化器:
在SGD的基础上增加了动量
v
v
v(可以理解为速度),权重不再是往梯度方向上移动,而是沿着新的速度向量方向移动来更新。
由下图可知实际的移动方向会受到损失梯度的方向与旧的动量方向的影响,二者得到新的动量方向
优点:
- 可以有效抑制噪声的干扰,动量会使曲线更加平稳的到达最小值点,而不会直线之字形曲线。当拥有速度后,像’之’字形的移动会很快的抵消,减少在敏感方向上的移动。
- 有机会跳出局部最优解。
③ Adagrad优化器(自适应学习率)
对学习率进行操作,使得学习率可以自适应改变。
S
t
S_t
St是对从开始到
t
t
t时刻所有的损失梯度平方 进行求和:
S
t
=
∑
i
=
0
t
g
(
w
i
)
∗
g
(
w
i
)
S_t=\sum_{i=0}^{t}g(w_i)*g(w_i)
St=∑i=0tg(wi)∗g(wi)。
随着训练的进行,分母会越来越大,达到学习率自适应改变的效果。
缺点:
- 学习率可能会下降的太快,导致未达到全局极小值就停止了。
④ RMSProp优化器(自适应学习率)
在Adagrad优化器的基础,增加了两个系数来控制衰减速度
⑤ Adam优化器 (自适应学习率)
使用了两个动量与衰减参数。
一阶动量控制参数的移动方向,二阶动量控制学习率的变化。
类似于SGD + Momentum与RMSProp的结合。
原文地址:https://blog.csdn.net/Life1213/article/details/140636850
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!