卷积神经网络简介

        之所以单独列出一篇文章来讲述卷积神经网络的原理,是因为如果像之前一样,把代码和原理结合起来,由于卷积神经网络有更多的抽象的理论,学习理解起来将会碰到很多麻烦。这一篇简介依然是从‘’Tensorflow’的角度来介绍卷积神经网络,这么说是因为,当你认真看完第一遍这简介之后,懵懵懂懂,不知所然;再结合下一篇的TF实现卷积神经网络的代码,我认为一定能够对卷积神经网络产生更加理性的认识。那么开车惹。

        卷积神经网络(Convolutional Nerual Network,CNN)最初是用于解决图像识别问题的方法,当然不局限于图像和视频,也能用于时间序列信号,如音频,文本数据等等。可以说是引领了人工智能潮流的功臣之一。相对于全连接神经网络(嗯,就我们前面所介绍),由于采用了权值共享结构,减少了神经网络需要的参数量,避免了过拟合,并保留了结构信息,卷积神经网络在准确度上比全连接神经网络更进一步。

        首先我们稍微了解下卷积神经网络的理念的由来。(嗯,这些内容基于生物方向,我们看着涨知识,有所了解就行)上世纪60年代,科学家们通过对猫的视觉皮层细胞研究发现,每一个视觉神经元细胞只会处理一小块区域的视觉图像。80年代,日本科学家提出神经认知机的概念,这是卷积网络最初的实现原型。该模型中有两类神经元,一类是用于抽取特征的S-cells(对应于之后要提到的卷积核),另一类是用来抗形变的C-cells(对应于**函数池化操作)。显然我们可以预测,卷积神经网络不再是之前全连接神经网络那般,对一个个的像素进行的操作,而是对一个个的小块的分割的图像进行训练学习(之后再经过多个隐藏层,将提取的多种特征进行组合)。好处显而易见,以一来保持了图片的空间结构的信息,二来,减少参数和运算。那么最大的问题便是,这么做,能不能提高准确率呢?

        通常一个卷积神经网络包括多个卷积层,也会包括全连接层(多层神经网络几乎都是卷积神经网络,因为全连接神经网络如果有多个隐含层,那么参数数量就是天文数字)。那么我们重点来看看,卷积层中是怎么样对数据进行操作的。

Step1,图片通过多个不同的卷积核的滤波,并加偏置bias,提取出局部特征,每一个卷积核会映射出一个新的2D图像;

Step2,将前面的卷积核的滤波输出结果,进行非线性的**函数处理,如常用的ReLU和Sigmoid函数等。

Step3,对**函数的结果进行池化操作(降采样,例如将2*2的图片降为1*1,仅仅保留最显著的特征,目前一般使用最大池化的方法)

      那么卷积神经网络的权值共享体现在哪里呢?一个卷积层中有多个不同的卷积核,而每一个卷积核都对应一个滤波后的新图像,同一个新图像中的每一个像素都来自于完全相同的卷积核,这就是卷积核的权值共享。

        又,那么卷积神经网络具体是怎么减少计算量和参数量的呢?卷积神经网络简介(找张图帮助理解下)

        我们通过对比来感受一下。例如,我们的图片尺寸是1000*1000像素,黑白图像,那么一张图就有1000000个像素点,如果连接一个拥有100w的隐藏层,那么将有100w*100w=1万亿个连接,仅一个全连接层就有这么多的权重要去训练,一来硬件吃不消,二来过拟合会十分严重。卷积神经网络的优势就体现出来了:由于每一个感受野只是感受一小块区域的信号,即每一个神经元不需要接受全部的像素点的信息,只需要接受局部的像素点作为输入,局部连接!我们假设,局部视野感受的图像大小为10*10,那么每个隐层节点(这就是卷积核)只与10*10个像素点相连,那么在拥有100w个隐层节点的情况下,仅需10*10*100w=1亿个连接;更激动人心的是,由于权值共享结构的设置,举个极端例子,如果仅有1种类型的卷积核(即所有隐层节点参数均相同),那么一层卷积层仅有10*10个参数,反向传播时的计算简直不要太少!当然,通常我们不能仅有一个卷积核,好在图像中的基本特征也不多(点,边等),卷积核的数量一般设置100个就很充足了!假设使用100个卷积核,那么我们的参数数量就是100*10*10=10000个,比之前的1亿个参数减少了10000倍!值得注意的是,卷积神经网络中的隐层节点,仅与‘感受野‘的大小有关,即卷积的步长。例如,若卷积步长为1,则局部视野大小为1*1,那么隐层节点的数量就与输入的像素数量一样;若步长为5,则局部视野大小为5*5,隐层节点的数量就为输入像素数量的1/25(在这里,我们说的隐层节点的数量不等同于卷积核的类型的数量,要注意区分)。完成这些之后,我们再通过池化,保留最显著的特征,提升模型的畸变容忍能力。那么一层卷积层就算是完成了。

      有了上述的单层卷积层理论计算基础,那么再多添几层卷积层也是手到擒来的事情。上面的简介是基于我的理解和之后代码步骤的参考,写出来的,对之后代码的认识很有帮助。我们在学习的过程中,不仅要知其然,还要知其所以然,个人觉得,学习能力是极具竞争力的一种能力。我们只有把原理掌握好,才能游刃有余。哇好像废话扯多了,那么使用TF实现卷积神经网络的代码请看下一篇文章吧。