卷积神经网络原理及其C++/Opencv实现(2)
在上篇文章中我们主要讲了神经元与卷积神经元的基础知识:
在本文中,我们继续来讲一下池化层、全连接层的基础知识。我们这里所说的全连接层,就是上篇文章中所说的5层网络中的O5层,其实它如果更细分的话,又可以分成Affine层和输出层。
1. 池化层
池化层通常连接在卷积层后面,在卷积神经网络中添加池化层的目的是:在不丢失主要信息的前提下,降低卷积层输出结果的数据量。这样一来,既可以减小运算的复杂度,也可以有效避免过拟合现象(所谓过拟合,即训练神经网络所得到的参数模型,对训练数据的处理表现优良,但是对其它数据的处理则表现不理想的现象)。
常见的池化层方法有均值池化层、最大值池化层,下面我们分别讲述其原理。
假设卷积结果为m行n列的图像,池化窗口为r行c列(m>r,n>c),以下内容我们以4*4的输入图像、2*2的池化窗口为例进行说明。
(1) 均值池化层
对输入图像进行均值池化,相当于使用池化窗口覆盖在输入图像上面从左往右、从上至下地滑动,每滑动到一个位置,计算池化窗口在输入图像上所覆盖区域的像素平均值,作为池化输出。
既然是窗口滑动,就涉及到滑动步长step的选择,step可以取固定的1,2,3...,但是要求满足条件step+c<n且step+r<m,否则左右或者上下滑动一步就超出输入图像的范围了。通常我们默认左右滑动的step=c,上下滑动的step=r,即池化窗口的两个相邻位置没有重叠也没有间隔,本系列文章所讲的池化层,也均如此默认。
对4*4的输入图像进行2*2池化窗口的均值池化,按照默认step,池化窗口左右上下滑动的step均为2,其过程如下图所示:
(1) 最大值池化层
最大值池化操作与均值池化操作大同小异,都是池化窗口在输入图像上从左往右、从上至下的滑动,区别在于:均值池化取池化窗口中的平均值作为池化结果,而最大值池化取池化窗口中的最大值作为池化结果。如下图所示:
2. 全连接层
在这里,我们把全连接层细分为Affine层和输出层来讲。上文说到的5层网络的全连接层如下图所示。
在卷积神经网络中,之所以在最后一层加一层全连接层,而不是卷积层,是为了输出设计者自己想要的数据个数,而Affine层正好可以实现这个需求。对于分类问题,在网络的最后需要输出各个类别的概率,并认为最大概率的类别为最终分类结果,因此在Affine层之后还需要连接一层输出层,把每个类别的输出值转换为0~1之间的概率,转换函数通常使用Softmax函数。
注意:由于全连接层是最后一层,Softmax函数就相当于Affine输出的激活函数,在Affine与Softmax之间不需要另外再加别的激活函数了。
(1) Affine层
全连接层的上一层是池化层,假设池化层的输出为k张r*c的图像,需要把这几张图像按顺序平摊成一维向量,其长度为m=k*r*c:
假设分类问题有n个输出,那么该层有n个神经元,每个神经元的输入都是以上向量X的m个数据。
Affine层的输出按照下式计算,其中0≤i<n,0≤j<m。由此可知,该层有对应的m*n个权重,以及n个偏置。
(2) 输出层
输出层在Affine层之后,主要功能是把Affine层的输出转换为0~1之间的概率值。该功能由Softmax函数实现:
Softmax函数的输出即为神经网络最终的输出。
为了使用梯度下降法调节参数(后面再详细说明),通常使用交叉熵误差函数来衡量Softmax函数的输出值与标签值的差距,其中t为标签值,Y为Softmax函数的输出。
总共有n个输出,每个输出对应一个标签t。对于分类问题,输出的多个结果中,只有一个结果是对应正确解,也只有该结果对应的标签t为1,其它结果对应的标签都是0。比如对于手写数字图像的分类:
0对应的10个标签为:1 0 0 0 0 0 0 0 0 0
1对应的10个标签为:0 1 0 0 0 0 0 0 0 0
2对应的10个标签为:0 0 1 0 0 0 0 0 0 0
3对应的10个标签为:0 0 0 1 0 0 0 0 0 0
4对应的10个标签为:0 0 0 0 1 0 0 0 0 0
.
.
.
9对应的10个标签为:0 0 0 0 0 0 0 0 0 1
本文就讲到这里,下篇文章我们将开始从数据的角度详细推导5层卷积神经网络的前向传播与后向传播。敬请期待!