一、卷积神经网络的来源
卷积神经网络(Convolutional Neural Networks),简称CNN,是模仿人类视觉皮层功能的深度学习算法。
我们先举个直观例子了解下人眼看到物体的情况,如下图所示:
![4f72468d1dddc0ea9a38be62d413632c.png](https://i-blog.csdnimg.cn/blog_migrate/bb0b4abfaa8bc3bc796529c0ef93fe87.jpeg)
人眼看到物体的过程
这张图实中眼睛里其中的一个神经元,它会盯着图像,但它并不会盯着图像的每一个像素,它只会盯着图像的一部分。盯的一部分,称为感受野,也就是感受一部分视野。另外一个神经元它又会盯着另外的一部分,但是它们有重叠。这就相当于一些神经元看线, 另外一些神经元会看线的方向,这些线和方向会组合成一些更大的感受野,然后组成一些基础图像,基础图像再组合成我们的所看到的图像。
我们可以看到上图中一个神经元识别到局部像素点为一条竖杠,另一个神经元对识别出来是一条横杠,然后再有一条神经元识别出一条竖杠,这三个基本的点成线的抽象汇总到一个神经元后提取出来一个门(一竖一横一竖的门),而另一些神经元会把一个房顶识别出来,然后门加房顶不断的提取汇总,最终汇总出来一个房子。因此卷积神经网络思想就是模仿人体视觉图层看到物体的过程所诞生出的深度学习算法。
二、卷积神经网络结构中的概念理解
了解完卷积思想来源之后,我们再来谈下卷积神经网络中的一些概念。实际上我们的卷积就是上面所提到的感受野。还是以上面案例解释下,我们可以发现第一个隐藏层(h1),它里面的每个神经元不再是全连接到原来的每一个像素点,而是只连接到一个局部,比如图中视觉细胞所看到的红色区域不再是这一层的全部神经元,而是一个局部信息。
![175571a3926abc316c8f224633f18a76.png](https://i-blog.csdnimg.cn/blog_migrate/3f66db949569c1cf9c6c121e87025c72.jpeg)
视觉细胞看到局部信息图示
局部里面包含多少像素点,它就和前面连接有多少像素点。在卷积网络结构里面隐藏层的名称跟传统神经网络区分开,叫卷积层。卷积层里面的一个神经元,它只会接收到前面输入层里面的其中某一部分,这就是我们所谓的局部连接。
![50d7ef01b1dd2237b3ce766dc93fc4a6.png](https://i-blog.csdnimg.cn/blog_migrate/e8accc6e7fafb6079b21820f7bee56d8.jpeg)
卷积中的局部连接
这样结构的设计有什么样的好处呢 ?
我们可以从另一面看来思考这个问题,假设这一层是全连接的话,那么中间对应的参数一定是前后两层的节点数所组成的参数矩阵。比如前面一层是4个节点,后面一层是4个节点,那么中间的参数应该是4行4列这样一个矩阵。
![1d4077ca3efa245346b167bf76356884.png](https://i-blog.csdnimg.cn/blog_migrate/88fe1d7abb6f5871c3305738d8f827cd.jpeg)
前后层次节点所组成的(4,4)的参数矩阵形状
而这里如果是局部连接的话会使w的个数减少很多,这样对我们的计算要求就相对削弱很多。
但是这会不会影响我们的最后的准确率呢?
实际上不会。我们可以通俗的这样理解,因为人类的视觉中每个神经元虽然看局部的一个像素点,但是神经元不单单只有一层,它是层层传递的,最后达到我们的视觉皮层,我们的卷积神经网络里也是通过层数的增加弥补参数减少的原因,所以不会影响准确率。
三、卷积神经网络结构中的卷积过程理解
了解完卷积层中的基本概念后,我们再来看下卷积神经网络结构中的卷积具体的过程。
我们举个手写体数字识别的例子来理解下这个过程。
对于Mnist手写体数字集来说,一张图片里面有784个像素点。假设用DNN的分类的话,784个像素点会让它组合成一个行向量,也就是一维的维度。如果用CNN的话,我们就要把这个输入数据变成二维,那么我们的输入图像形状应该是28×28的。如果有M个图片,我们的输入就会是一个3维的矩阵,结构为(M,28,28),类似于我们面包片的排列,每一片面包对应图片就是28*28的这些像素点,每一次输入有M个面包组成。示意图如下:
![99792f737253819db7842c8866dbe42e.png](https://i-blog.csdnimg.cn/blog_migrate/887a405d5055708d7f07e2b2c7848a9b.jpeg)
(M,28,28)的输入维度
当然我们真正在输入的时候还应该加上通道数,对于黑白的图片来说,它是单通道,对于彩色图片,色域是有RGB(红绿蓝)三元素组成,所以就是三个通道,这样我们用DNN去分类的话真正的输入就是(M,28,28,1),最后1维就表示一个通道。对于彩色图片来说,输入形状为(M,28,28,3),最后一维就表示3个通道。
这里大家不免会问为什么要把784个维度一列变成28×28的方形呢?
这是因为我们做卷积的时候实际上是以一个小格的区域去扫描原来的图片, 它不再是一个像素点。比如下图卷积的示意图总共有3个层次,分别为一个输入层和两个隐藏层。我们分别称为输入层(Input layer),卷积层1(Convolutional layer1)和卷积层2(Convolutional layer2)。可以看到我们在输入的时候需要把我们的像素点组成一个大的区域,即一个28*28的矩阵,这样输入层到隐藏层之间才能做卷积的这种区域的操作。
首先我们看下从输入层到第一个隐藏层,我们的卷积神经网络到底做了什么?
我们以图中的红框(相当于我们定义好的一个卷积核)扫描输入层,第一次的扫描过后,汇总到卷积层1上一个像素点,即图示中Convolutional layer1层的红点,如图所示:
![8d7126b01ed2f50204b9f4c6fe9be837.png](https://i-blog.csdnimg.cn/blog_migrate/df90a1ca10c0468862c825c50b0dcbdd.jpeg)
从输入层到第一个隐藏层的第一次扫描
然后同样经过第二次扫描,由图中蓝色区域扫描输入层中同样大小的区域,然后再汇总成一个卷积层1上的另一个像素点,即图中Convolutional layer1所代表的蓝色点。如图所示:
![842aaf3054a011d64dc3eba843e1ae6a.png](https://i-blog.csdnimg.cn/blog_migrate/57efc9350113ae0db7f50bb8a272c681.jpeg)
从输入层到第一个隐藏层的第二次扫描
这样,经过一定次数扫描过后,在卷积层1上面会汇总所有从输入层扫描汇总的像素点。这些扫描出来的像素点组合成的结构我们称为feature map,即下图红色区域:
![c336040e6d2a50119c60d5c54c468baa.png](https://i-blog.csdnimg.cn/blog_migrate/5dd29cbd3674f3fe87e85408c59b3e6c.jpeg)
feature map示意图
每一个feature map都是上一层到本层的经过卷积之后提取的像素点,我们可以理解它从原始图像抽象出来的图。这样一个过程就是我们所理解的特征提取。
然后同理,对下一层来说,我们当前的卷积层1就相当于下一层的输入层,所以接下来从卷积层1到卷积层2的变化也是一样的过程,比如图中从卷积层1第一次扫描一个区域汇为卷积层2上的一个像素点即图中粉色对应的像素点。
![aaa6c53d6451facc9975b9e6e7a27161.png](https://i-blog.csdnimg.cn/blog_migrate/5134f621a64a3d2cf613422871647b3d.jpeg)
从卷积层1到卷积2输入的第一次扫描
然后同理依次不断卷积,再传给上游的网络,最后再结合分类算法就是我们的卷积神经网络整个过程了。