卷积神经网络是一种前馈神经网络,它主要包括:输入层、卷积层、池化层和全连接层。每一层有多个特征图,每个特征图通过一种卷积滤波器提取输入的一种特征,每个特征图有多个神经元。接下来我们分别了解一下每一层的工作情况。
在原始的输入上进行特征的提取,通过卷积运算我们可以提取出图像的特征。
以一个 3*3 卷积核 filter 为例(步距为1),将它覆盖到图像特征上面,将二者对应位置的数字相乘然后相加,滑动计算,得到最终卷积结果。
计算一下右下角的 3*3 矩阵,将橘色部分分别和卷积核对应数字相乘,1*1+1*0+1*1+1*0+1*1+0*0+1*1+0*0+1*0 = 4 相加得到卷积结果为 4。
卷积特性
(1)拥有局部感知机制:由于图像的空间联系是局部的,每个神经元不需要对全部的图像做感受,只需要感受局部特征即可。
(2)权值共享:简单理解就是,对输入图片用一个filter去扫,filter里面的数就叫权重,这张图的每个位置被同一filter扫,所以权重是一样的,即共享。
经卷积后的矩阵尺寸大小计算公式为:
N = W − F + 2 P S + 1 N = \frac{W-F+2P}{S}+1 N=SW−F+2P+1 输入图片大小:W*W 卷积核大小:F*F 步长:S padding的像素数:P
注意:
(1)卷积核的 channel 与输入特征层的 channel 相同
(2)输出特征层 channel 与卷积核个数相同
在多层神经网络中,上层节点的输出和下层节点的输入之间具有一个函数关系,这个函数称为激活函数,又称激励函数。
引入非线性函数作为激励函数,这样深层神经网络表达能力就更加强大(不再是输入的线性组合,而是几乎可以逼近任意函数)。那有哪些激活函数呢?他们各自的优劣是什么呢?下面我们来具体介绍一下:
(1)Sigmoid 函数
Sigmoid 是常用的非线性的激活函数,数学公式为:
f ( x ) = 1 1 + e − z f(x) = \frac{1}{1+e^{-z}} f(x)=1+e−z1
由图可知,左端趋近于 0,右端趋近于 1,且两端都趋于饱和。能够把输入的连续实值变换为 0~1 之间的输出;如果是非常大的负数,那么输出就是 0;如果是非常大的正数,输出就是 1。
缺点:
(i)Sigmoid 函数饱和时梯度值非常小,在深度神经网络中梯度反向传递时容易导致梯度消失。
(ii)Sigmoid 的 output 不是 0 均值,这会导致后一层的神经元将得到上一层输出的非 0 均值的信号作为输入。
(iii)其解析式中含有幂运算,计算机求解时相对来讲比较耗时,较大地增加训练时间。
(2)Tanh 函数
Tanh函数数学公式为:
f ( x ) = e z − e − z e z + e − z f(x) = \frac{e^{z}-e^{-z}}{e^{z}+e^{-z}} f(x)=ez+e−zez−e−z
解决了 Sigmoid 函数的不是 0 均值输出问题,然而梯度消失和幂运算的问题仍然存在。
(3)ReLu 函数
ReLu函数数学公式为:
r e l u ( x ) = m a x ( x , 0 ) relu(x)=max(x,0) relu(x)=max(x,0)
ReLu 是一个分段函数,显然其导数在正半轴为 1,负半轴为 0,这样它在整个实数域上有一半的空间是不饱和的。ReLu 很简单,但近几年被广泛使用。
优点:解决了梯度消失问题,计算速度非常快,收敛速度远快于 sigmoid 和 tanh。
缺点:当反向传播过程中有一个非常大的梯度经过时,反向传播更新后可能导致权重分布中心小于 0,导致该处的导数始终为 0,因此反向传播无法更新权重,即进入失活状态。
池化层夹在连续的卷积层中间,对特征图进行稀释处理,减少数据运算量,减小过拟合。其具体操作与卷积层的操作基本相同,只不过池化层的卷积核为只取对应位置的最大值、平均值等(最大池化/平均池化)。
池化层用的方法有 max pooling 和 average pooling,实际中使用较多的是 max pooling。
以上图为例,使用 max pooling 方法,卷积核 2*2,步长 2。对每个 2*2 的窗口选其中最大的数作为对应位置的输出,左上角红色框标出来的,其最大值为 6,以此类推,其他位置输出的数分别为 8,3,4。同样的道理,average pooling 是取平均值。
池化层特点:
(1)卷积核没有训练参数
(2)只改变特征矩阵的长和宽,不改变深度 channel
(3)一般池化层的卷积核大小和步长相同
全连接层的每一个结点都与上一层的所有结点相连,用来把前边提取到的特征综合起来。全连接层(fully connected layers,FC)在整个卷积神经网络中起到“分类器”的作用。全连接层大部分是两层,只用一层有时候没法解决非线性问题,而如果有两层或以上就可以很好地解决非线性问题了。