卷积神经网络相较于BP神经网络的进步主要是极大地减少了构建网络所需要的参数。对于一个1000∗1000像素的RGB图像(width=1000,height=1000,depth=3),如果应用单层、十个神经元的BP神经网络构建网络模型,那么该网络就需要计算10∗1000∗1000∗3+10个参数的梯度。如果网络的层数或神经元数目增加,该模型的计算成本将无比巨大。Hubel和Wiesel在研究猫脑皮层时发现了局部感受野(某些神经细胞对于特定部分的视觉区域敏感),并据此提出了卷积神经网络,不再像BP神经网络那样采用全连接。如下图(图取自):
Filter
根据局部感受野,卷积神经网络引入了filter(在部分学术文章中,也称kernel)的概念。假设我们有一张5∗5像素的灰度图像input,2∗2的filter对input卷积后的结果如下图output所示。有一点需要注意!filter的depth值始终和其输入数据的depth值一致,且output的depth=1。但是可以应用多个filter对同一个输入数据卷积,并将其outputs叠在一起形成网络下一层的输入,outputs的depth等于filter的数目。
下面给出卷积的公式:
Output=Convf(Input)Outputi,j=∑h=0Hf−1∑w=0Wf−1∑d=1DfInputi+h,j+w,d∗filteri+h,j+w,d
其中,
i∈{1,2,…,HI−Hf+1};j∈{1,2,…,WI−Wf+1}。
HI和
Hf表示
Input和
filter的
height,
WI和
Wf表示
Input和
filter的
width。
Zero-Padding
观察上例可以发现,直接对原始数据Input进行卷积,会造成每个像素对输出的贡献不均衡。例如,Input[1,1]对Output只有一次影响,而Input[3,3]对Output有四次影响。或者是想控制Output的height或width。都可以通过对原始数据的上下、左右四侧填充0。
Stride
同时,我们也可以调整filter的移动步伐。如下图:
结合Padding和Stride,Input、filter和Output之间的维度关系如下:
Depthfilter=DepthInputHeightOutput=HeightInput+2∗Padding−HeightfilterStride+1WidthOutput=WidthInput+2∗Padding−WidthfilterStride+1DepthOutput=1
卷积层
至此,我们已经可以构建出CNN的卷积层了。如下图:
Pooling层
通过增减卷积层filter的数目,可以控制该卷积层输出数据的depth,避免过拟合。而Pooling层的目的则是控制输出数据的height和width。Pooling主要有average pooling和max pooling,故名思义,前一个是在计算filter覆盖范围内值的均值,后一个选取filter覆盖范围内的最大值。如下图:
请注意!Pooling层中filter的depth始终为1,不改变输入数据的depth值。输入数据与输出数据的深度一致。结合上面的卷积层,CNN网络演变如下:
全连接层
最后,介绍卷积神经网络中的最后一种网络层——全连接层。在CNN中,继输入层后,会连续交替放置若干个卷积层和Pooling层的组合,然后将最后一层Pooling层向量化,放置全连接层,输出层多采用Softmax或Logistic Regression做分类输出。完整的CNN网络如下图:
请注意!卷积层和Pooling层可以有多个接替组合,而上图仅包含一个组合。