卷积神经网络 — Convolutional Neural Network

卷积神经网络相较于BP神经网络的进步主要是极大地减少了构建网络所需要的参数。对于一个10001000像素的RGB图像(width=1000,height=1000,depth=3),如果应用单层、十个神经元的BP神经网络构建网络模型,那么该网络就需要计算10100010003+10个参数的梯度。如果网络的层数或神经元数目增加,该模型的计算成本将无比巨大。Hubel和Wiesel在研究猫脑皮层时发现了局部感受野(某些神经细胞对于特定部分的视觉区域敏感),并据此提出了卷积神经网络,不再像BP神经网络那样采用全连接。如下图(图取自):


卷积神经网络 — Convolutional Neural Network

Filter

根据局部感受野,卷积神经网络引入了filter(在部分学术文章中,也称kernel)的概念。假设我们有一张55像素的灰度图像input22filterinput卷积后的结果如下图output所示。有一点需要注意!filterdepth值始终和其输入数据的depth值一致,且outputdepth=1。但是可以应用多个filter对同一个输入数据卷积,并将其outputs叠在一起形成网络下一层的输入,outputsdepth等于filter的数目。


卷积神经网络 — Convolutional Neural Network

下面给出卷积的公式:

Output=Convf(Input)Outputi,j=h=0Hf1w=0Wf1d=1DfInputi+h,j+w,dfilteri+h,j+w,d

其中,i{1,2,,HIHf+1};j{1,2,,WIWf+1}HIHf表示InputfilterheightWIWf表示Inputfilterwidth

Zero-Padding

观察上例可以发现,直接对原始数据Input进行卷积,会造成每个像素对输出的贡献不均衡。例如,Input[1,1]Output只有一次影响,而Input[3,3]Output有四次影响。或者是想控制Outputheightwidth。都可以通过对原始数据的上下、左右四侧填充0


卷积神经网络 — Convolutional Neural Network

Stride

同时,我们也可以调整filter的移动步伐。如下图:


卷积神经网络 — Convolutional Neural Network

结合PaddingStrideInputfilterOutput之间的维度关系如下:

Depthfilter=DepthInputHeightOutput=HeightInput+2PaddingHeightfilterStride+1WidthOutput=WidthInput+2PaddingWidthfilterStride+1DepthOutput=1

卷积层

至此,我们已经可以构建出CNN的卷积层了。如下图:


卷积神经网络 — Convolutional Neural Network

Pooling层

通过增减卷积层filter的数目,可以控制该卷积层输出数据的depth,避免过拟合。而Pooling层的目的则是控制输出数据的heightwidthPooling主要有average poolingmax pooling,故名思义,前一个是在计算filter覆盖范围内值的均值,后一个选取filter覆盖范围内的最大值。如下图:


卷积神经网络 — Convolutional Neural Network

请注意!Pooling层中filterdepth始终为1,不改变输入数据的depth值。输入数据与输出数据的深度一致。结合上面的卷积层,CNN网络演变如下:


卷积神经网络 — Convolutional Neural Network

全连接层

最后,介绍卷积神经网络中的最后一种网络层——全连接层。在CNN中,继输入层后,会连续交替放置若干个卷积层和Pooling层的组合,然后将最后一层Pooling层向量化,放置全连接层,输出层多采用SoftmaxLogistic Regression做分类输出。完整的CNN网络如下图:


卷积神经网络 — Convolutional Neural Network

请注意!卷积层和Pooling层可以有多个接替组合,而上图仅包含一个组合。