卷积神经网络相较于
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
层可以有多个接替组合,而上图仅包含一个组合。