没有合适的资源?快使用搜索试试~ 我知道了~
资源详情
资源评论
资源推荐
机器学习系列(5)
卷积神经网络CNN之--原理及Python实现
卷积神经网络的原理解释:
计算机视觉
边缘检测
Padding
卷积步长
单卷积层
池化层
卷积神经网络示例
为什么选择CNN
Python实现:
见文章内容
申明
本文原理解释及公式推导部分均由LSayhi完成,供学习参考,可传播;代码实现部分的框架由Coursera提供,由LSayhi完成,详细数据及代码可在
github查阅。 https://github.com/LSayhi/Neural-network-and-Deep-learning (https://github.com/LSayhi/Neural-network-and-Deep-learning)
一、卷积神经网络(CNN)的原理和步骤
1.计算机视觉:
计算机视觉是一门研究如何使机器学会“看”的学科,让机器能够从图像或多维图像中感知。其应用广泛,比如人脸识别、自动驾驶、风格转换等。
在本系列先前的个人笔记中,我们将深度神经网络应用于识别猫,虽然取得了不错的效果,但是训练分类器的时间较长,本次我们将介绍卷积神经
网络(CNN),这种流行的网络结构广泛应用于计算机视觉领域,并取得了很好的效果。
2.边缘检测:
在本系列之前的识别猫的笔记中,我们提到了应用深度全连接的神经网络进行分类,当图像像素比较高时,将会遇到非常大的麻烦。举例说明,如
所示,若图片大小为 ,第一层隐藏层神经元个数为1000,那么 的维度将是 ,与数据量相比大很
多,很容易发生过拟合,而且巨大的参数数量,将导致对内存的需求急剧增大,社图片的边长为n,那么这种需求是 级的,这显然不适合于大
规模计算。卷积神经网络通过卷积运算,大大减小了深度学习的计算量,而且在效果上表现更突出。
Figure 1 : MLP实现的分类器
边缘检测是卷积神经网络的一个概念,它的作用是提取出图片中物体的边缘信息(可以认为是一种滤波),进而网络可以根据提取到的特征进行分
类。例如 所示,边缘检测通过两个边缘检测器(滤波器,也叫核,即kernel),分别检测出了图片的垂直边缘和水平边缘,这就是边缘检
测的简单示例。那么边缘检测是如何作用的又是如何实现的,举个例子来说,见 ,假设图片中像素值越大的部位越亮,反之越暗,那么经过
一个垂直检测器(figure 3中)后,过滤出来的新图片(figure 3右)检测出了原来图片(figure 3左)的明暗交界边缘。事实上改变过滤器中的值的大
小和分布可以构造出形式各样的检测器。
Figure 2 : 边缘特征
Figure
1
1000
∗
1000
∗
3
W
[1]
1000
∗
3
M
= 30
亿
0
( )
n
2
Figure
2
Figure
3
Figure 3 : 卷积示意
那么这个过滤的操作是什么呢?其实就是“卷积运算”(和数学上定义的卷积稍有不同,在数学定义中卷积运算在对应元素相乘之前,会有一个对
Kernel先反向,在CNN中我们不进行反向,原因是其不影响对边界特征的提取,关于此点,可参见个人专题笔记《机器学习中的数学(1)--卷积运
算》),以图 说明这里“卷积”的含义,图中左边是一个图片的像素矩阵,中间是过滤器,右边是新检测出的边缘图片,左边有三种颜色标记
的框,经过“卷积”运算后,对应在右边相应颜色的输出位上,看出来了吧,这里的卷积指的是矩阵的元素乘积求和,然后移动Kernel再次求和,最后
拼成新的矩阵。所以改变过滤器,可改变输出的新图形(称为特征)。在卷积神经网络中,我们把过滤器中的值当作参数让网络去学习,这样可以
自动给出具体的值,并且可以检测任何角度的边缘特征,通过这种计算方式,我们提取特征的方式从全连接变成了卷积,参数数量减小为(过滤器的
大小 *过滤器的个数 ,时间复杂度降为 ,不再是输入维数的平方量级,这大大减小了深度学习的计算量。
Padding:
Padding,顾名思义为填充。前面提到,我们在做特征提取时,用到的是卷积运算,由于其运算特点,容易发现其对整张图片的边沿部分的数值在计
算中使用较少,而在其它区域,其数值不止使用较多,这意味这对于边沿部分提取到的特征较少,而且可以发现,每次进行特征提取后,图像的大
小减小了,但你可能不想让某次的图像减小。为了解决这两个问题,CNN引入了Padding思想,即在卷积运算之前,图像外沿先填充新的像素点,
这样边缘信息能被更好的提取,新出来的特征图像大小也会更大,通过合适选择填充像素圈数(设为p)和Kernel的大小,可以控制输出特征图像的
大小,常见的有等维度输出,半维度输出等。如图 ,对一个 大小的图像,经过 大小的Kernel,其输出图像维度为 ,而当我们
在外圈填充一层像素之后,图像先变成了 ,然后经过 的kernel,输出图像依然是 ,这就是padding的作用。
Figure 4 : Padding举例
卷积步长:
在以上的描述中,Kernel每次移动的步长都是 ,如果把每次移动的步长定义为卷积步长(Stride,简略为 表示),那么提取出来的特征图像与步
长为1时大小不一样,例如当 为2时,输入输出大小的的关系如图 。
Figure 5 : 卷积步长
- 一般的,容易得到特征矩阵的大小与原图像和Kernel的关系可用下式表示(假设原图像大小为 ,Kernel的大小为 ,Padding的大小为 ,那么输出
的大小为 . 三维卷积: - 三维卷积即是一维卷积和二维卷积的推广,事实上N维空间上的卷积形式是一样的,这里特地介绍
Figure
3
J
∗
K L
O
(
J
∗
K
∗
L
)
Figure
4
6
∗
6 3
∗
3 4
∗
4
8
∗
8 3
∗
3 6
∗
6
1
S
S
Figure
5
n
∗
n
f
∗
f
P
( + 1)
∗
( + 1)
n
+2
p
−
f
S
n
+2
p
−
f
S
三维卷积是为了描述RGB图像的边缘提取,黑白图像的维度可以用二维平面表示,而彩色图像需要用三维空间来表示,因为彩色图像有三个通道,所以
在做卷积运算时,kernel的维度为从二维增加到三维,第三个维度的大小与彩色图像的必须通道数相同, 是三维卷积的演示,注意输出不是
,而是 。
Figure 6 : 三维卷积示意
单卷积层:
以上是卷积神经网络的基础描述,下面介绍单层卷积神经网络的具体实现。以图 为例,单层神经网络在三维卷积的基础上增加了一个
Kernel个数的维度,显然输出最后一个维度也自然成了三维Kernel的个数 ,和全连接神经网络一样,我们也加入了激活函数。单卷积层相当于在
提取图像的特征。从这里可知,不管输入图像多大,参数的数量只由Kernel的大小和个数确定,因此参数数量远远小于全连接神经网络。
Figure 7 : 单层卷积神经网络
池化层pooling:
池化层是一层对图像进行另一种处理的层,直观来说,这一层的作用是提取区域特征,从实际效果上看,这种方式确实提升了CNN的“看”的能力。
是池化的一个示例,此例中使用的是最大池化(Max pooling),即取对应区域的最大值,此外常用的还有平均值池化等。池化层也有对应
的Kernel,步长等参数,但是不同于卷积层的Kernel,这些参数并不需要由网络学习得到,我们给定Kernel的大小和步长后,计算是确定的(卷积
层的Kernel参数还有每个Kernel里的数字,池化层没有),所以池化层不会额外增加新的参数,且由于其能缩小图像尺寸,反而能加快训练。当输
入图像是三维的时候,kernel也对应增加为3维,同样输出也增加为3维(不同于卷积运算,因为在卷积层,kernel的个数是可以改变的,这增加输出
的一个维度,而在池化层,kernel的个数确定是1,所以为了能使池化的输出作为卷积的输入,取最大值时,不会在三维空间取,而是在二维平面取
完后,在第三个维度拼接)。
Figure
6
4
∗
4
∗
3 4
∗
4
∗
1
Figure
7
K
Figure
8
剩余17页未读,继续阅读
苏采
- 粉丝: 11
- 资源: 302
上传资源 快速赚钱
- 我的内容管理 展开
- 我的资源 快来上传第一个资源
- 我的收益 登录查看自己的收益
- 我的积分 登录查看自己的积分
- 我的C币 登录后查看C币余额
- 我的收藏
- 我的下载
- 下载帮助
安全验证
文档复制为VIP权益,开通VIP直接复制
信息提交成功
评论0