卷积神经网络(一)
——卷积、边缘化与池化层
(原创内容,转载请注明来源,谢谢)
一、概述
卷积神经网络网络(Convolutional Neural Network,CNN),是一种神经网络的模型,在计算机视觉(computer vision,CV)领域运用广泛。
计算机视觉,旨在完成图像分类、物体识别、图像合成创作等工作,主要难度在于输入的特征值非常多。
例如对于一个64*64像素的图片,就一共要处理12288个特征,而更大的图片则需要处理的特征值更多,这就导致使用原来机器学习的模型解决问题时,速度会很慢。而CNN正好可以解决这个问题。
二、边缘检测
边缘检测(edge detection),即检测物体在图片中的边界,这是cv的基础。边缘检测的方法,是通过构建过滤器,令图片的rgb值和过滤器进行卷积,得到的结果即检测出的结果。
1、卷积计算
这里先考虑黑白图片,则没有rgb三个值,只有1个值,表示这个点的亮度。假定滤波器是一个3*3的矩阵,值如下图所示,原图的灰度值矩阵为下图左边那副图所示,则进行卷积计算:
卷积计算的方式如下:
设原图为矩阵A,是一个6*6的矩阵;滤波器为矩阵B,是一个3*3的矩阵。
1)先把B放到矩阵A上,并且A的[1,1]元素与B的[1,1]元素对其,则重叠出3*3的矩阵。
2)再把重叠的位置,对应的元素相乘,得到1个3*3的矩阵,设为C。
3)把C的所有元素相加,得到卷积结果矩阵[1,1]位置的值。
4)这里采用的步长是1。则接下来把B的[1,1]与A的[1,2]对齐,在进行上面步骤的计算,得到结果矩阵[1,2]位置的值。当一行计算完成,则把B的[1,1]与A的[2,1]对齐,进行计算,以此类推。
2、垂直边缘检测
上述的计算,即实现了垂直物体的边缘检测,下图的例子更为直观:
可以看到,经过这种滤波器的卷积,可以突出图片的垂直形状的灰度值,这利于后续的计算。
3、水平边缘检测
类似的,还有水平边缘检测的滤波器,如下图所示:
4、其他边缘检测滤波器
除了用上面的滤波器,还可以使用其他的值来实现边缘检测,常用的有sobel滤波器和scharr滤波器,下图展示的都是垂直滤波器。如果需要水平滤波器,只需要把下面的矩阵,对应元素放置到旋转90°的位置即可。
三、Padding
1、现有问题
上面的边缘检测,可以看到进行卷积的时候,6*6的矩阵和3*3的矩阵,卷积的结果变成4*4,这样一来图片变小了,多进行几次卷积,会导致图片消失;另外还有一个问题,在于图片边缘的点,参与卷积的次数较少,这样会损失图片边缘的信息量。
2、padding介绍
为了解决这个问题,可以使用padding的方式。Padding=1,表示在原图的最外层,加上全部都是的一层的值,把6*6的矩阵变成8*8的矩阵,此时在进行卷积,可以发现最终得到的还是6*6的矩阵。
3、padding公式
考虑Padding后,矩阵卷积的结果矩阵的维度的通用公式:n+2p-f+1,其中n表示原图是n*n的图片,f表示滤波器是f*f的矩阵,p即padding,如下图所示:
4、p的选择
P通常有两种选择方式:
1)valid卷积,即令p=0。
2)same卷积,即保证输出矩阵大小和输入矩阵一致,此时p=(f-1)/2
从这里也可以看出,滤波器的维度f通常需要是奇数,这样保证可以用same卷积,且有中心像素点,便于指出滤波器的位置。
四、步长
步长,即计算卷积过程中,每次移动过滤器的幅度。这里幅度既代表了水平移动的幅度,也代表了垂直移动的幅度。如下图所示:
综合考虑步长、padding后,计算两个矩阵卷积后的输出矩阵的维度大小的公式如下:
五、立体矩阵卷积
上面是假是定图片是黑白的,当考虑到rgb时,则变成3维的,这里要对应的修改滤波器的维度。
假设图片是6*6*3的矩阵,这里的6*6*3称为高*宽*通道(channels),需要注意的是,滤波器的channels值和图片的channels值必须一样,才能进行卷积。
则6*6*3的矩阵与3*3*3的矩阵,卷积的结果是4*4*1。
为了得到rgb的特征,可以分别用不同的滤波器与图片进行卷积,得到不同的结果。
因此引入了多重滤波的概念,即原图同时与两个滤波器进行卷积,会得到两个结果矩阵,这里把两个结果矩阵进行重叠,形成的立体矩阵,即为多重滤波的结果。
六、卷积神经网络
1、单层
考虑到神经网络的第l层,则对应的常用的参数符号如下图所示:
这里滤波器即为待计算的参数。
2、多层
一幅图片,要进行处理,通常需要经过若干次卷积,例如下图所示:
这里有个常用的卷积方法:通常随着卷积层数的增加,涉及到的滤波器个数增加,但是滤波器本身的尺寸不变。所以通常卷积多层后,图片会变得细长型,如上图所示。
七、池化层
除了卷积,cnn还需要池化层,便于提取卷积的结果。
池化层,也是一种矩阵的计算,如下图所示:
一个2步长、宽度2的最大值池化层,即取出矩阵每个2*2子矩阵的元素最大值。下图右边那个是结果,值为9 2 6 3
对于立体矩阵,则每一层的进行池化的操作。
除了最大值池化,还有平均值池化。但是通常最大值池化更长用。
需要说明的是,池化层只有滤波器尺寸f和步长s两个超参数,这两个参数是不需要经过fp、bp进行学习的,是初始就设定好的参数。矩阵经过池化层后的维度计算,和之前卷积的维度计算公式一致。
常用的超参数设定,f=2、s=2、p=0。
八、总结
1、计算过程
图片经过cnn后的计算,如下图所示:
通常,会经过若干的卷积层+池化层(经常把卷积层和池化层共称为1层)的操作,再把矩阵按顺序纵向排列成n*1的矩阵,接下来进行若干次全连接层的计算(全连接层即原来的神经网络的计算,每个元素都参与计算),最终再经过一层softmax计算,得到结果矩阵。
2、优点
卷积的计算,减少参数的参与,例如对于32*32*3的图片,要得到28*28*6的矩阵,普通的神经网络会经过约3072*4704≈1400万次的计算,而卷积只需要经过(5*5+1)*6=156次计算。
另外,卷积有三大特点:
1)参数共享:特定滤波器在图片任一小块都适用,可以共享特征。
2)稀疏连接:每一小部分的输出值,与图片其他部分无关。
3)平移不变:图片平移,由于和原图相似,卷积计算的结果也是相似的。
3、过程总结
如下图所示:
——written by linhxx 2018.03.06
领取专属 10元无门槛券
私享最新 技术干货