在深度学习的路上,从头开始了解一下各项技术。本人是DL小白,连续记录我自己看的一些东西,大家可以互相交流。
本文参考:本文参考吴恩达老师的Coursera深度学习课程,很棒的课,推荐
本文默认你已经大致了解深度学习的简单概念,如果需要更简单的例子,可以参考吴恩达老师的入门课程:
http://study.163.com/courses-search?keyword=%E5%90%B4%E6%81%A9%E8%BE%BE#/?ot=5
转载请注明出处,其他的随你便咯
一、前言
卷积神经网络(Convolutional Neural Network, CNN)是一种深度前馈人工神经网络,已成功地应用于图像识别领域,同时在声纹识别领域,也取得了不小的成果。
二、卷积运算
卷积运算是卷积神经网络的基本组成部分,我们用边缘检测的例子来说明一下卷积运算的过程。
在下图中,我们通过垂直边缘检测和水平边缘检测,可以获得右边的图像:
即,仅保留图片中的垂直边缘或水平边缘。
垂直边缘检测:
假设一张图片的大小为 6×6(数字表示图片大小,具体为像素值),和一个3×3的filter(卷积核)进行卷积运算,用“*”符号表示。图片和垂直边缘检测器分别如图中左1矩阵和左2矩阵:
卷积运算的过程,实际上是让filter从图片左上角开始不断移动,不断地和其大小相同的部分做对应元素的乘法运算并求和,最终得到的数字相当于新图片的一个像素值,如右矩阵所示,最终得到一个 4×4 大小的图片。这个过程即为卷积运算。
PS.给出卷积纬度计算公式:
图片为 n×n 大小,filter为 f×f 大小,结果为(n - f + 1)×(n - f + 1)
三、填充(Padding)
在卷积运算的过程中,我们发现了如下的问题:
- 每次卷积操作,会让图片缩小;
- 如例子中,6×6的图片,经过 3×3 filter的卷积后,只剩下4×4 大小
- 角落和边缘位置的像素在卷积运算的过程中,参与的次数很少,最终结果中,可能会损失数据。
为了解决如上的两个问题,我们在进行卷积运算前,为图片加Padding,包围角落和边缘的像素,使得通过filter的卷积运算后,图片大小不变,也不会丢失角落和边缘的信息。Padding的过程如图所示:
用p来表示Padding的值,当输入为n×n大小的图片,最终得到的图片大小为(n + 2p − f + 1)×(n + 2p − f + 1),为了让图片大小保持不变,需根据filter的大小f来调整p的值。根据是否使用Padding我们可以将卷积分为两种。
Valid / Same 卷积:
- Valid卷积:没有padding,输入n×n的图像,输出(n - f + 1)×(n - f + 1)的图像;
- Same卷积:有padding,输出与输入图片大小相同,p = (f - 1) / 2。
四、卷积步长(stride)
卷积的步长是构建CNN的一个基本的属性。在上述的例子里面,我们使用的步长 stride = 1,即每次filter移动一个像素。当stride = 2时,卷积运算如下:
即每次filter在计算完一个数值时,会移动两个像素的位移,继续计算下一个数值。
我们用s表示stride步长的大小,那么在进行卷积运算后,图片从n×n大小,变为如下大小:
五、立体卷积
在上面的例子和介绍中,我们的图像都是二维的。在应用于彩色图像时,我们用RGB三通道来表示一张图片。其中R红色,G绿色和B蓝色,该表示法是用三个三原色的数值,来组合成一个图片。当我们对彩色图片进行卷积的时候,此时的卷积核应为三维卷积核。
其实与二维的卷积类似,只是我们现在的filter与图片的维度保持一致,卷积核的第三个维度需要与图片保持一致&