1.图像的输入
一张照片是如何输入到神经网络中的。众所周知,计算机适合处理的是矩阵运算,所以必须要把图片转换成矩阵后计算机才能认识。所有的彩色图像都由红绿蓝(RGB)叠加而成,成为图像的三个通道,一张图片在计算机中存储也是通过这三个矩阵完成的。
RGB这三个矩阵称为为图像的3个通道,也作为神经网络的输入数据。(直方图均衡里边可以先把RGB转化为HSV处理)
2.卷积神经网络的组成
与其他神经网络相同,CNN网络同样也包含输入层、隐藏层、输出层几大部分,卷积神经网络的主要运算过程如图
卷积层(Convolutional layer):卷积层由多个卷积单元组成,每个卷积单元的参数都是通过反向传播算法优化得到的。卷积运算主要为了提取图像的特征,随着卷积层的增加,多层网络可以提取更为复杂的图像特征。
线性整流(Rectified Linear Units layer, ReLU layer):主要指的是激活函数运算(Activation function)使用线性整流的ReLu函数(Rectified Linear Units, ReLU)。
池化层(Pooling layer):在卷积之后图像的维度特征依然很多,将特征矩阵分割成几个单个区块,取其最大值或平均值,起到了降维的作用。
全连接层(Fully-Connected layer):把所有局部特征以及各通道的特征矩阵结合变为向量代表,计算最后每一类的得分。
3.实现过程
数据规则化
彩色图像的输入通常先要分解为R(红)G(绿)B(蓝)三个通道,其中每个值介于0~255之间。
卷积运算(Convolution)
前面讲到,由于普通的神经网络对于输入与隐层采用全连接的方式进行特征提取,在处理图像时,稍微大一些的图将会导致计算量巨大而变得十分缓慢。卷积运算正是为了解决这一问题,每个隐含单元只能连接输入单元的一部分,我们可以理解为是一种特征的提取方法。
首先我们来明确几个基础概念:深度(depth)、步长(stride)、补零(zero-padding)、卷积核(convolution kernel)。
深度(depth):深度指的是图的深度与它控制输出单元的深度,也表示为连接同一块区域的神经元个数。
步幅(stride):用来描述卷积核移动的步长。
补零(zero-padding):通过对图片边缘补零来填充图片边缘,从而控制输出单元的空间大小。
卷积核(convolution kernel):在输出图像中每一个像素是输入图像中一个小区域中像素的加权平均的权值函数。卷积核可以有多个,卷积核参数可以通过误差反向传播来进行训练。
下图为步长=1的卷积计算过程,卷积核依次向右移动进行卷积运算得到相应结果。
为图像计算可以对边缘进行补零,可见这个过程改变了图像的运算大小
全部图像卷积运算可以概括为下边这个公式。其中B代表卷积后的结果,K是卷积核,A为图像的输入矩阵。
激活
CNN卷积神经网络在卷积后需要经过激活过程,当前通常使用的激活函数是Relu函数。Relu函数的主要特点在之前的章节已经讲过。从函数的图像上来看,单侧抑制,相对宽阔的兴奋边界,具有稀疏激活性的特点。
在卷积层后面紧接着是一个ReLU层,主要定义了name,type,bottom,top,其属于非线性激活函数的一种,同类型的函数还有sigmoid函数,tanh函数,softplus函数等等。对于ReLU函数,其公式即为个ReLU(x)=max(0, x),而sigmoid函数为sigmoid(x)= 1/(1+e^-x),而Softplus(x)=log(1+e^x)。
Relu函数
在深度神经网络中,通常使用一种叫修正线性单元(Rectified linear unit,ReLU)作为神经元的激活函数。ReLU起源于神经科学的研究:2001年,Dayan、Abott从生物学角度模拟出了脑神经元接受信号更精确的激活模型,如下图:
ReLU激活函数的形式,如下图
ReLU函数其实是分段线性函数,把所有的负值都变为0,而正值不变,这种操作被成为 单侧抑制 。可别小看这个简单的操作,正因为有了这单侧抑制,才使得神经网络中的神经元也具有了稀疏激活性。尤其体现在深度神经网络模型(如CNN)中,当 模型增加N层之后,理论上ReLU神经元的激活率将降低2的N次方倍 。
稀疏性的作用:当训练一个深度分类模型的时候,和目标相关的特征往往也就那么几个,因此通过ReLU实现稀疏后的模型能够更好地挖掘相关特征,拟合训练数据。
此外,相比于其它激活函数来说,ReLU有以下优势:对于线性函数而言,ReLU的表达能力更强,尤其体现在深度网络中;而对于非线性函数而言,ReLU由于非负区间的梯度为常数,因此不存在梯度消失问题(Vanishing Gradient Problem),使得模型的收敛速度维持在一个稳定状态。这里稍微描述一下什么是梯度消失问题:当梯度小于1时,预测值与真实值之间的误差每传播一层会衰减一次,如果在深层模型中使用sigmoid作为激活函数,这种现象尤为明显,将导致模型收敛停滞不前。
池化(Pooling)
池化的目的是提取特征,减少向下一个阶段传递的数据量。池化操作相对于对每个深度切片是独立,池化规模一般为像素的 2*2,与卷积运算相比,池化层运算一般有以下几种:
- 最大池化(Max Pooling):取4个点数值的最大值。这是最常用的池化算法。
- 均值池化(Mean Pooling):取4个点数值的均值。
- 高斯池化(Gauss Pooling):按照高斯模糊的方法。
最大池化的计算方法。
高斯模糊
图像要用二维正态分布,确定权重矩阵
有了权重矩阵,就可以计算高斯模糊的值了。
假设现有9个像素点,灰度值(0-255)如下:
每个点乘以自己的权重值:
得到
将这9个值加起来,就是中心点的高斯模糊的值。
对所有点重复这个过程,就得到了高斯模糊后的图像。如果原图是彩色图片,可以对RGB三个通道分别做高斯模糊。
全连接(Fully-connected layer)
全连接层一般出现最后几步,在卷积神经网络中起到“分类器”的作用。如果说卷积层、池化层和激活函数层等操作是将原始数据映射到隐层特征空间的话,全连接层则起到将学到的“分布式特征表示”映射到样本标记空间的作用。全连接过程是对矩阵的展开过程,也可以理解为输出矩阵与一个1*1的卷积核进行卷积运算,最后展开为一个1*n的向量。
在卷积神经网络中,全连接层一般使用Softmax函数来进行分类。Softmax函数适用于数据分类,用于保证每个分类概率总和为1。
Softmax函数
softmax函数,又称归一化指数函数。它是二分类函数sigmoid在多分类上的推广,目的是将多分类的结果以概率的形式展现出来。
将预测结果转化为非负数
下图为y=exp(x)的图像,我们可以知道指数函数的值域取值范围是零到正无穷。softmax第一步就是将模型的预测结果转化到指数函数上,这样保证了概率的非负性。
各种预测结果概率之和等于1
为了确保各个预测结果的概率之和等于1。我们只需要将转换后的结果进行归一化处理。方法就是将转化后的结果除以所有转化后结果之和,可以理解为转化后结果占总数的百分比。这样就得到近似的概率。
例子:假如模型对一个三分类问题的预测结果为-3、1.5、2.7。我们要用softmax将模型结果转为概率。步骤如下:
1)将预测结果转化为非负数
y1 = exp(x1) = exp(-3) = 0.05
y2 = exp(x2) = exp(1.5) = 4.48
y3 = exp(x3) = exp(2.7) = 14.88
2)各种预测结果概率之和等于1
z1 = y1/(y1+y2+y3) = 0.05/(0.05+4.48+14.88) = 0.0026
z2 = y2/(y1+y2+y3) = 4.48/(0.05+4.48+14.88) = 0.2308
z3 = y3/(y1+y2+y3) = 14.88/(0.05+4.48+14.88) = 0.7666
总结一下softmax如何将多分类输出转换为概率,可以分为两步:
1)分子:通过指数函数,将实数输出映射到零到正无穷。
2)分母:将所有结果相加,进行归一化。
卷积神经网络(CNN)的计算过程虽然讲解繁琐,但对于了解深刻理解神经网络算法非常有益。卷积神经网络经过近30年的发展拥有多条网络发展分支,并且持续高速发展之中。其中有网络层数加深的VGG16与VGG19等,有卷积模块增强的NIN网络等,从分类任务向目标检测任务过度的新型网络R-CNN等。