1.1 为什么有了全连接网络模型还要CNN?
全连接网络模型是指在神经网络中每两层之间的所有结点都是相连接的,但在处理图像数据时,全连接网络所需要的参数个数太多,比如处理一张单通道图片,图片大小为2828,设隐藏层的节点数为500个,则由其组成的全连接网络模型的参数有`2828*500+500=392500`,“+500”是因为考虑了偏置项b的情况,而当图片更大时,参数会急剧增多,参数过多不仅会导致网络模型计算速度变慢,同时也容易导致过拟合问题,CNN的出现就是为了在一定程度上改善这种情况。
1.2 卷积层和池化层
图1展示了一个典型的CNN模型结构图。
从上图中可以看出,CNN的卷积层(Convolution)和池化层(Polling)中每个节点只与上一层的部分节点相连,卷积层的每个节点的输入只是上一层中的一小块,这个小块的大小由卷积核的窗口大小决定,通常来说,经过卷积层处理的节点矩阵会变得更深,具体的深度由卷积层中卷积核的多少来决定。卷积核的参数是共享可以使得图像上的内容不受位置的影响,即图片中的猫不管是在图片的左上角或者右下角都应该被分类为猫,同时共享卷积核的参数可以大幅减少网络模型中的参数,降低运算的复杂度。
池化层的每个节点的输入也是上一层(通常是卷积层)的一小块,这个小块的大小由池化核的窗口大小决定,池化层不会改变节点矩阵的深度,但它可以改变矩阵的大小,通俗来说,对于图像处理,池化层中池化操作可以理解为是将一张分辨率高的图片转化为分辨率低的图片。常用的池化操作有最大池化、平均池化等,通过卷积层和池化层后,可以进一步缩小网络模型中的参数个数,下面我们来分析下CNN如何减少网络模型中的参数。
1.2.1 维度变化过程
卷积层是CNN中重要的概念之一,通过卷积核对上一层进行卷积操作,完成特征抽取。本节主要分析卷积层和池化层的维度变化过程,在使用全0填充(如果步长为1则可避免节点矩阵通过卷积层后尺寸发生变化)时,卷积层\池化层的输出维度计算公式为:
out(longth)
表示卷积层输出矩阵的长度,它等于输入层矩阵长度除以在长度方向上的步长的向上取整值,out(width)
表示卷积层输出矩阵的宽度,它等于输入层矩阵宽度除以在宽度方向上的步长的向上取整值。
如果不使用全0填充,则卷积层\池化层的输出维度计算公式为:
filter(length)
表示卷积核\池化核在在长度方向上的大小,filter(width)
表示卷积核\池化核在在宽度方向上的大小。
假如输入层矩阵的维度为32*32*1
,1代表灰度图像,第一层卷积核尺寸为5*5
,深度为6
(即有6个卷积核),不使用全0填充,步长为1。则卷积层的输出维度为(32-5+1=28
),卷积层的参数共有5*5*1*6+6=156
个,这里可以发现,卷积层的参数个数与图片大小无关,它只与卷积核尺寸、深度以及当前层节点矩阵的深度有关,这使得CNN可以扩展到任意大小的图像数据上,卷积层的输出维度即下一层(通常是池化层)的输入维度有28*28*6=4704
个节点;池化层的池化核大小为2*2
,步长为2
,池化层的输出维度为(28-2+1)/2=13.5
,向上取整的结果为14,池化层不影响节点矩阵的深度,则池化层的输出维度为14*14*6
。