深入学习卷积神经网络(CNN)原理

1例子引入

假设我们有这样的一张图片,大小8×8:

图片中的数字代表该位置的像素值,图的中间两个颜色的分界线就是我们要检测的边界。怎么检测这个边界呢?我们可以设计这样的一个 滤波器(filter,也称为kernel卷积核),大小3×3

然后,利用这个filter,往我们的图片上“盖”,覆盖一块跟filter一样大的区域之后,对应元素相乘,然后求和。计算一个区域之后,就向其他区域挪动,接着计算,直到把原图片的每一个角落都覆盖到了为止。这个过程就是 “卷积”。这里的“挪动”,就涉及到一个步长(strides)了,假如步长是1,那么覆盖了一个地方之后,就挪一格,最终,将这6×6个区域的卷积结果,拼成一个矩阵:

对于这个例子,很好地解释了卷积操作和卷积核,我自己理解卷积核就代表了一种特征,通过设计特定的filter,然后将它跟图片做卷积,就可以识别出图片中的某种特征,比如上述例子中的边界。这也是CNN的核心思想,主要就是通过一个个的filter,不断地提取特征,从局部的特征到总体的特征,从而进行图像识别等等功能。对于filter的设计,我们可以通过大量的数据,来 让机器自己去“学习”这些参数嘛。这,就是CNN的原理。

二 CNN的相关概念

1,padding

起初我不能理解,上述原图像在经过filter卷积之后,变小了,从(8,8)变成了(6,6)。假设我们再卷一次,那大小就变成了(4,4),每进行一次卷积操作,图像的大小都会降低,那么卷积n次之后,图像的不就没了。后来了解到,每次卷积前,我们需要先给图片周围都补一圈空白,让卷积之后图片跟原来一样大,同时,原来的边缘也被计算了更多次。如下图所示:

比如,我们把(8,8)的图片给补成(10,10),那么经过(3,3)的filter之后,就是(8,8),没有变。在模型的构建中,如果想要进行填白,就将参数padding="same",把不经过任何填白的,称为 padding=“valid”即可。

2.stride 
步长,很好理解,就是每次卷积操作之后,卷积核移动的步数。

3.pooling 

pooling的目的是为了降低模型参数,防止出现过拟合。有两种当时max_pooling和average_pooling,顾名思义,max_pooling就是取卷积核覆盖区域中的最大值,average_pooling取卷积核覆盖区域中的平均值。卷积核大小2*2

4.对多通道(channels)图片的卷积

彩色图像,一般都是RGB三个通道(channel)的,因此输入数据的维度一般有三个:(长,宽,通道)。如果输入图片的维度是3,比如是(8,8,3),这个时候,我们的filter的维度就要变成(3,3,3)了,它的 最后一维要跟输入的channel维度一致。
这个时候的卷积,是三个channel的所有元素对应相乘后求和,也就是之前是9个乘积的和,现在是27个乘积的和。因此,输出的维度并不会变化。还是(6,6)。,但是,一般情况下,会使用多了filters同时卷积,比如,如果同时使用4个filter的话,那么 输出的维度则会变为(6,6,4),我特地画了下面这个图,来展示上面的过程:

图中的输入图像是(8,8,3),filter有4个,大小均为(3,3,3),得到的输出为(6,6,4)。我觉得这个图已经画的很清晰了,而且给出了3和4这个两个关键数字是怎么来的。

其实,如果套用前面学过的神经网络的符号来看待CNN的话,

  • 我们的输入图片就是X,shape=(8,8,3);
  • 4个filters其实就是第一层神金网络的参数W1,,shape=(3,3,3,4),这个4是指有4个filters;
  • 输出,shape=(6,6,4);
  • 激活函数,比如relu,经过激活后,Z1变为A1,shape=(6,6,4);

三、CNN的结构组成

卷积层,池化层,全连接层(这部分就很简单了,而且图片已经很清晰了,就不在过多描述了)

这里需要说明的是,在经过数次卷积和池化之后,我们 最后会先将多维的数据进行“扁平化”,也就是把 (height,width,channel)的数据压缩成长度为 height × width × channel 的一维数组,然后再与 FC层连接,这之后就跟普通的神经网络无异了

四、卷积神经网络 VS. 传统神经网络

其实现在回过头来看,CNN跟我们之前学习的神经网络,也没有很大的差别。
传统的神经网络,其实就是多个FC层叠加起来。
CNN,无非就是把FC改成了CONV和POOL,就是把传统的由一个个神经元组成的layer,变成了由filters组成的layer。那么,为什么要这样变?有什么好处?
具体说来有两点:

1.参数共享
对比传统神经网络的层和由filters构成的CONV层:假设我们的图像是8×8大小,也就是64个像素,假设我们用一个有9个单元的全连接层:

使用全连接,那这一层我们需要多少个参数呢?需要 64×9 = 576个参数(先不考虑偏置项b)。因为每一个链接都需要一个权重w。同样有9个单元的filter则如下图所示:

使用filter,其有几个单元就几个参数,所以总共就9个参数!因为,对于不同的区域,都共享同一个filter,因此就共享这同一组参数。这也是有道理的,filter是用来检测特征的,那一个特征一般情况下很可能在不止一个地方出现,比如“竖直边界”,就可能在一幅图中多出出现,那么 共享同一个filter不仅是合理的,而且是应该这么做的。由此可见,参数共享机制,让网络的参数数量大大地减少。这样,用较少的参数,训练出更加好的模型,典型的事半功倍,而且可以有效地 避免过拟合。同样,由于filter的参数共享,即使图片进行了一定的平移操作,照样可以识别出特征,这叫做 “平移不变性”。因此,模型就更加稳健了。

2.连接的稀疏性(sparsity of connections)
由卷积的操作可知,输出图像中的任何一个单元,只跟输入图像的一部分有关系:

只跟输入的一部分有关而传统神经网络中,由于都是全连接,所以输出的任何一个单元,都要受输入的所有的单元的影响。这样无形中会对图像的识别效果大打折扣。比较,每一个区域都有自己的专属特征,我们不希望它受到其他区域的影响。


 

发布了16 篇原创文章 · 获赞 1 · 访问量 4005

猜你喜欢

转载自blog.csdn.net/Wu_whiteHyacinth/article/details/103528277