前言
在过去的几年里,卷积神经网络(CNN)引起了人们的广泛关注,尤其是因为它彻底改变了计算机视觉领域,它是近年来深度学习能在计算机视觉领域取得突破性成果的基石。它也逐渐在被其他诸如自然语言处理、推荐系统和语音识别等领域广泛使用。在这里,主要从三个方面介绍CNN,
(1)CNN历史发展 (2)CNN简单介绍 (3)CNN相关基础知识
一、卷积神经网络历史沿革
卷积神经网络的发展最早可以追溯到上世纪60年代,Hubel等人通过对猫视觉皮层细胞的研究,提出了感受野这个概念,到80年代,Fukushima在感受野概念的基础之上提出了神经认知机的概念,可以看作是卷积神经网络的第一个实现网络。 而后随着计算机软硬件技术的发展,尤其GPU,使得CNN快速发展,在2012年ImageNet大赛中CNN由于其高精确度脱颖而出,于是,深度学习正式进入人们的视野。而后,R-CNN,FAST-CNN,Faster-cnn等快速发展,在深度学习领域大放异彩。
1962年 Hubel和Wiesel
卷积神经网络的发展,最早可以追溯到1962年,Hubel和Wiesel对猫大脑中的视觉系统的研究。
1980年 福岛邦彦
1980年,日本科学家福岛邦彦在论文《Neocognitron: A self-organizing neural network model for a mechanism of pattern recognition unaffected by shift in position》提出了一个包含卷积层、池化层的神经网络结构。
1998年 Yann Lecun
1998年,在这个基础上,Yann Lecun在论文《Gradient-Based Learning Applied to Document Recognition》中提出了LeNet-5,将BP算法应用到这个神经网络结构的训练上,就形成了当代卷积神经网络的雏形。
2012年 Hinton组
直到2012年,Imagenet图像识别大赛中,Hinton组的论文《ImageNet Classification with Deep Convolutional Neural Networks》中提到的Alexnet引入了全新的深层结构和dropout方法,一下子把error rate从25%以上提升到了15%,颠覆了图像识别领域。
和人认识事物的过程一样,有外界信号刺激眼睛的视神经,而后传到大脑皮层,形成物体的形象,卷积神经网络通过识别图像的特征,以对图片的特征识别。
二、CNN简单介绍
在 CNN 出现之前,图像对于人工智能来说是一个难题,有2个原因:
图像需要处理的数据量太大,导致成本很高,效率很低
图像在数字化的过程中很难保留原有的特征,导致图像处理的准确率不高
(1)需要处理的数据量太大
图像是由像素构成的,每个像素又是由颜色构成的,通常彩色图片有RGB三原色组成,每一种单通道的图都是由一个0 -255之间的二维矩阵组成。
现在随随便便一张图片都是 1000×1000 像素以上的, 每个像素都有RGB 3个参数来表示颜色信息。假如我们处理一张 1000×1000 像素的图片,我们就需要处理3百万个参数!
1000×1000×3=3,000,000
这么大量的数据处理起来是非常消耗资源的!
卷积神经网络 – CNN 解决的第一个问题就是“将复杂问题简化”,把大量参数降维成少量参数,再做处理。
(2)保留图像特征
图片数字化的传统方式我们简化一下,就类似下图的过程:
对于上述图片的处理,可以看出,同样的原点,处理方式完全不一样,图像的内容(本质)并没有发生变化,只是位置发生了变化。
所以,在卷积神经网络中,他用类似视觉的方式保留了图像的特征,当图像做翻转,旋转或者变换位置时,它也能有效的识别出来是类似的图像。
那么,人是如何识别图片的呢?
当您看到一个物体时,您眼中的光感受器会通过视神经将信号发送到正在处理输入的主视觉皮层。在初级视觉皮层,使眼睛看到的东西的感觉。神经元和大脑连接的深层复杂层次结构在记忆和标记物体的过程中起着重要作用。
上图完整的展示了我们是如何通过视神经来识别外界物体的,人类的视觉原理如下:从原始信号摄入开始(瞳孔摄入像素 Pixels),接着做初步处理(大脑皮层某些细胞发现边缘和方向),然后抽象(大脑判定,眼前的物体的形状,是圆形的),然后进一步抽象(大脑进一步判定该物体是只气球)。即外界输入,初步处理,特征选择,然后进一步抽象识别物体。
那么,卷积神经网络作为普通神经网络的一种,又是如何工作的呢?
对于普通的神经网络,即全连接感知器模型,如下图:
多层感知器模型能够很好的处理二维数据,这种方法的局限性在于,
图像在同一列邻近的像素在这个向量中可能相距较远。它们构成的模式可能难以被模型识别。
对于大尺寸的输入图像,使用全连接层容易导致模型过大。假设输入是高和宽均为1,0001,000像素的彩色照片(含3个通道)。即使全连接层输出个数仍是256,该层权重参数的形状也是3,000,000×2563,000,000×256:它占用了大约3 GB的内存或显存。这会带来过于复杂的模型和过高的存储开销。
卷积神经网络依旧是层级网络,只是层的功能和形式做了变化,可以说是传统神经网络的一个改进。比如下图中就多了许多传统神经网络没有的层次,如卷积层,池化层等。
卷积神经网络的层级结构
• 数据输入层/ Input layer
• 卷积计算层/ CONV layer
• ReLU激励层 / ReLU layer
• 池化层 / Pooling layer
• 全连接层 / FC layer
CNN,即卷积神经网络,CNN本质上是一个多层感知机,其成功的原因关键在于它所采用的局部连接和共享权值的方式,一方面减少了的权值的数量使得网络易于优化,另一方面降低了过拟合的风险。
三、CNN基础知识
在详细介绍卷积神经网络之前,了解几个基本的概念是非常有必要的。
1.二维卷积运算
卷积神经网络相比较其他常规的神经网络在于其能够利用卷积来提取图像中的特征,那么,什么是卷积运算呢?
在二维卷积层中,一个二维输入数组和一个二维核(kernel)数组通过互相关运算输出一个二维数组。我们用一个3*3的矩阵和2*2的核来做二位互相关运算,图中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:0×0+1×1+3×2+4×3=190×0+1×1+3×2+4×3=19。
在二维互相关运算中,卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。当卷积窗口滑动到某一位置时,窗口中的输入子数组与核数组按元素相乘并求和,得到输出数组中相应位置的元素。依次做卷积运算,即得到:
用动图来展示:
那么,二维卷积层将输入和卷积核做互相关运算,并加上一个标量偏差来得到输出。卷积层的模型参数包括了卷积核和标量偏差。在训练模型的时候,通常我们先对卷积核随机初始化,然后不断迭代卷积核和偏差。用卷积来实现两个矩阵之间的运算,
2.特征图和感受野
二维卷积层输出的二维数组可以看作输入在空间维度(宽和高)上某一级的表征,也叫特征图(feature map)。影响元素xx的前向计算的所有可能输入区域(可能大于输入的实际尺寸)叫做xx的感受野(receptive field)。
以下图为例,输入中阴影部分的4个元素是输出中阴影部分元素的感受野。我们将图中形状为2×22×2的输出记为Y,并考虑一个更深的卷积神经网络:将Y与另一个形状为2×22×2的核数组做互相关运算,输出单个元素zz。那么,z在Y上的感受野包括Y的全部4个元素,在输入上的感受野包括其中全部9个元素。可见,我们可以通过更深的卷积神经网络使特征图中单个元素的感受野变得更加广阔,从而捕捉输入上更大尺寸的特征。
3.填充和步幅
一般来说,假设输入形状是h×w×w,卷积核窗口形状是h×w,那么输出形状将会是
(n−k+1)×(n−k+1).
所以卷积层的输出形状由输入形状和卷积核窗口形状决定。
(1)填充
填充(padding)是指在输入高和宽的两侧填充元素(通常是0元素)。填充可以增加输出的高和宽。
下图我们在原输入高和宽的两侧分别添加了值为0的元素,使得输入高和宽从3变成了5,并导致输出高和宽由2增加到4。图5.2中的阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:0×0+0×1+0×2+0×3=00×0+0×1+0×2+0×3=0。
(2)步幅
卷积窗口从输入数组的最左上方开始,按从左往右、从上往下的顺序,依次在输入数组上滑动。我们将每次滑动的行数和列数称为步幅(stride),即卷积核在输入矩阵中每次滑动的行数和列数。步幅可以减小输出的高和宽。
下图展示了在高上步幅为3、在宽上步幅为2的二维互相关运算。可以看到,输出第一列第二个元素时,卷积窗口向下滑动了3行,而在输出第一行第二个元素时卷积窗口向右滑动了2列。当卷积窗口在输入上再向右滑动2列时,由于输入元素无法填满窗口,无结果输出。阴影部分为输出元素及其计算所使用的输入和核数组元素:0×0+0×1+1×2+2×3=80×0+0×1+1×2+2×3=8、0×0+6×1+0×2+0×3=60×0+6×1+0×2+0×3=6。
3.多通道输出
假设彩色图像的高和宽分别是h和w(像素),那么它可以表示为一个3×h×w的多维数组。我们将大小为3的这一维称为通道(channel)维,灰度图维为1×h×w。用多通道可以拓展卷积层的模型参数。
下图展示了含2个输入通道的二维互相关计算的例子。在每个通道上,二维输入数组与二维核数组做互相关运算,再按通道相加即得到输出。阴影部分为第一个输出元素及其计算所使用的输入和核数组元素:(1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56(1×1+2×2+4×3+5×4)+(0×0+1×1+3×2+4×3)=56。
1×1卷积层通常用来调整网络层之间的通道数,并控制模型复杂度。