这周主要学习了感知机、BP神经网络以及简单地对卷积神经网络的初探。
1.感知机
感知机(perceptron)是二分类的线性分类模型,其输入为实例的特征向量,输出为实例的类别,取+1和-1二值。感知机对应于输入空间(特征空间)中将实例划分为正负两类的分离超平面,属于判别模型。
感知机旨在求出将训练数据进行线性划分的分离超平面,为此,导入基于误分类的损失函数,利用梯度下降法对对损失函数进行纪晓华,求得感知机模型。
定义:假设输入空间是,输出空间是。输入表示实例的特征向量,对应于输入空间的点,输出表示实例的类别。由输入空间到输出空间的如下函数
称为感知机。其中,和为感知机模型的参数,sign是符号函数,即
感知机的几何解释:
线性方程对应于特征空间(输入空间)中的一个超平面,其中是超平面的法向量,是超平面的截距。这个超平面将特征空间划分为两个部分。位于两边的点(特征向量)分别被划分为正、负两类。因此,超平面称为分离超平面,如图所示:
学习策略
感知机学习的目标是求得一个能够将训练集正实例点和负实例点完全正确划分开的超平面(假设训练数据是线性可分的),为了找出这样的超平面S,即确定感知机模型参数和,需要确定一个学习策略,即定义损失函数极小化。
损失函数一个自然选择是误分类点总数,但该损失函数不是参数和的连续可到函数,不易优化,所以感知机采用的损失函数为误分类点到超平面的总距离。
输入空间中点到超平面的距离公式为:
其中,表示向量的范数,也即模长。
若将 看做哑结点,那么合并可得,其中,。
设误分类点集合为,那么所有误分类点到超平面的总距离为
对于误分类点,若,则,,;
对于误分类点,若,则,,;
因此,对于任意误分类点有,其中为当前感知机的输出。于是对于所有误分类点到超平面的总距离可改写为
对于所有误分类点到超平面的距离,该结果应该接近或等于0(无误分类点),也即损失函数极小化到0,也就是分子等于0,故对于所有误分类点到超平面的距离,可以极小化分子,不考虑分母。
不考虑分母得到的感知机学习的损失函数为
显然损失函数是非负的。若无误分类点,则,且误分类点越少,误分类点离超平面的越近,损失函数值越小。
如何极小化损失函数?
算法:
感知机学习算法是对以下最优化问题的算法,给定训练数据集,其中,。求参数使其为以下损失函数极小化问题的解
其中为误分类点的集合。
感知机学习算法是误分类驱动的,具体采用随机梯度下降法。首先,任意选取一个超平面,用梯度下降法不断地极小化损失函数,极小化过程不是一次使用中所有误分类点的梯度下降,而是随机选取一个误分类点使其梯度下降。
损失函数的梯度为
随机选取一个误分类点,对进行梯度更新:
,其中,,故,因此
感知机只有输出层神经元进行激活函数处理,即只拥有一层功能神经元,其学习能力非常有限。要解决非线性可分问题,需考虑使用多层功能神经元。
常见的神经网络是下入所示的层级结构,每层神经元与下一层神经元全互连,神经元之间不存在同层连接,也不存在跨层连接。这样的神经网络结构通常称为”多层前馈神经网络“。
其中输入层神经元接收外界输入,隐层与输出层神经元对信号进行加工,最终结果由输出层神经元输出。神经网络的学习过程,就是训练数据来调整神经元之间的“连接权”以及每个功能神经元的阈值;换言之,神经网络“学”到的东西,蕴涵在连接权与阈值中。
2.BP算法
多层网络的学习能力比单层感知机强很多。欲训练多层网络,简单的感知机学习规则显然不够了,需要更强大的学习算法。误差逆传播(BP算法)就是最杰出的代表。
上图网络中有个参数需要确定:输入层到隐层的个权值、隐层到输出层的个权值、个隐层神经元的阈值、个输出层神经元的阈值。BP是一个迭代学习算法,在迭代的每一轮中采用广义的感知机学习规则进行更新估计。
给定一个训练样本,假设模型输出为,则误差为
如果按梯度下降法更新模型的参数,那么各个参数的更新公式为
已知与的函数链式关系为
根据的定义,显然有
sigmoid函数有一个很好的性质:
定义
则的更新公式为
对于:
则有
对于:
定义
对于:
3.卷积神经网络
卷积神经网络(Convolutional Neural Network,CNN)是深度学习中一种常用模型。CNN在训练学习数据时进行特征提取和分类,同时同一特征映射面上的神经元权值相同,因此可以并行学习。
传统神经网络的结果如下图所示,权重和偏置均由神经元组成。卷积神经网络与传统神经网络结构相似,因此传统神经网络中的计算方法也适用于卷积神经网络。
两者的不同之处在于:由于卷积神经网络的输入是图像,传统神经网络的权重变为卷积神经网络的卷积核连接,其中卷积核共享神经元连接,使得神经网络神经元数量大大降低,另外在前馈阶段修正神经元的效率更高。
一般地,卷积神经网络由卷积层、激活层、池化层和全连接层组成。
卷积层
卷积层(Convolutional layer)由若干卷积核组成,每个卷积核中的参数由反向传播算法优化获得。每层中以多个二维特征平面作为输入,分别与若干组的多个卷积核进行卷积,输出为多个卷积结果叠加的若干二维特征平面,每层卷积运算的目的是将低级的特征层映射为更高级的特征层。
卷积层具有权值共享和局部连接两个特点。传统的神经网络将输入层全连接隐藏层。随着图像分辨率增长,全连接的权重数量呈指数级增长,训练参数的反向传播将变得极为耗时。为了解决这个问题,在卷积层中提出了感受野(receptive filed)的概念,通过共享感受野,达到减少权重数量的目的。卷积层输入和输出是多个二维特征平面组成的三维数据,如下图所示,输入单元的深度是3,输出单元的深度是5,输出单元的大小由深度、步幅和补零共同决定。
深度(depth):输出二维图像的数量
步幅(stride):控制隐含单元在输入区域运算的滑动距离
补零(zero-padding):在输入单元周围补零,使得输出单元的大小为整数。
定义W为输入单元的大小,F为感受野(卷积核)的大小,S为滑动步长,P为补零大小。利用如下公式计算输出单元的大小:
如果计算的输出单元大小不为整数,则需要调整步幅和补零。其中,卷积层正向传播的过程如下图所示。
输入是一个5*5的图像,即W=5,卷积核的大小为3*3,共有9个参数,即感受野F=3,在卷积的时候边界没有补零,即P=0,从图中可以看到蓝色区域和黄色代表的卷积核进行点乘操作,输出为右图中的灰色区域,且步幅S=1,根据上面的公式可以计算出输出单元的大小为((5-3+2*0)/1)+1=3。右图也称为特征图。
卷积就是循环对一个核逐个元素相乘再求和得到另外一副图像的操作。比如上图的结果图中第一个元素5是怎么计算的呢?原图中3*3的区域与3*3的核逐个元素相乘再相加:1*1+2*0+1*0+0*0+1*0+1*0+3*0+0*0+2*2=5。算完后再往右移一步继续计算,横向计算完后,再往下移一步继续计算。
用3*3的核对一副6*6的图像进行卷积,得到的是4*4的图,图片缩小了,同时损失了原图边缘的一些信息,这时候我们可以把原图扩充一圈,再卷积,这个操作称为padding。如果原图为n*n,卷积核为f*f,最终结果图的大小为(n-f+1)*(n-f+1)。
对于扩展的这一层具体应该怎么填充,OpenCV提供了好几种填充方式,同时使用cv2.copyMakeBorder()函数进行实现。
cv2.copyMakeBorder()用来给图片添加边框,它有下面几个参数:
src:要处理的原图
top, bottom, left, right:上下左右要扩展的像素数
borderType:边框类型,这个就是需要关注的填充方式,详情请参考:BorderTypes
下面将介绍最常用的默认方式和固定方式:
默认边框类型 cv2.BORDER_DEFAULT
默认方式其实是取镜像对称的像素填充,详细解释如下:
default = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_DEFAULT)
print(default)
首先进行上下填充,填充成与原图像边界对称的值,如下图所示:
同理再进行左右两边的填充,最后把四个顶点补充上即可:
固定值填充 cv2.BORDER_CONSTANT
固定值填充,顾名思义,就是边框中都填充一个固定值,比如下一面的程序都填充0。
import cv2
import numpy as np
img = cv2.imread('6_by_6.bmp', 0)
cons = cv2.copyMakeBorder(img, 1, 1, 1, 1, cv2.BORDER_CONSTANT, value=0)
print(cons)
|
填充形式如下:
对于具体应该采用何种方式进行填充,一般情况下默认方式更加合理,因为其与边界的像素值更加接近,当然具体情况也需视情况而定。
激活层
激活层是对卷积层或池化层g层的结果进行非线性映射。常见的激活函数包含Sigmoid、Tanh和Relu等。
Sigmoid函数的计算公式如下:
在BP算法反向传播时,前层的梯度是后层以乘积的方式获得,因此,当网络层数较多时,传递至前层的梯度则会非常小,甚至使反向传播失效。f(x) 激活函数的缺点是饱和时梯度值非常小。
Tanh函数的计算公式如下:
其中,为sigmoid函数,仍然具有饱和的问题。
Relu函数公式如下,将负值强制为0,解决了卷积神经网络在反向传播时的梯度耗散问题。
Relu激活函数,当x>1时,函数值为变量本身,当x<1时,函数值为0,提高了二维特征图的稀疏性。
池化层
池化层具有三个重要的作用:
1)特征不变性,在图像下采样后仍保留图像最重要的特征,仅去掉一些冗余信息,可以将采样层理解为特征提取层,提取出“同样信息”的高层特征具有特征不变性。
2)降维,卷积层输出多个二维特征层,由于二维特征的数据量非常大并且权值信息有重复,通过池化(下采样)减小二维特征层尺寸,在提取特征的同时也降低特征层尺寸(维度)。
3)防止过拟合,使得网络更容易进行学习。
池化层可以分为最大池化(Max Pooling)和平均池化(Mean Pooling),目前使用较多的是Max pooling。
Max pooling过程下图所示,在输入单元中以2*2窗口的最大值作为输出单元的对应元素的值,其中,第一个2*2窗口的最大值是6,那么输出单元的相应元素为6。同理,Mean Pooling是在输入单元中以2*2窗口的平均值作为输出单元的相应元素的值。
全连接层
全连接层的输入通常是卷积神经网络的最后一个卷积层,输出为一个固定维度的特征向量。特征向量包含人脸图像通过卷积核池化获得特征的组合信息。由于卷积神经网络通过大量样本进行训练学习,因此全连接层的特征向量具有较强的鲁棒性。在图像分类和识别领域中,通常利用卷积神经网络的全连接层作为图像特征,并且结合相关有效的分类器,即可实现图像的分类和识别。