一、图像分类定义
可以用一个简单的公式来描述图像分类的过程:
训练:通过训练集{(x1,y1),...,{xn,yn}}来获得一个预测函数f,满足在训练集上的最小误差。
测试:向预测函数f输入一个从来没有见过的x,得到预测值y。
二、泛化能力
我们在训练的过程中,要注意所训练出来的模型的泛化能力。所谓泛化能力,就是要让模型认识不同形态、不同颜色等不同特征的同类事物,例如苹果,苹果有黄色的、绿色的、红色的等,当训练出来的模型不能只认识红色的,而要认识各种不同种类的苹果。
所以,我们在训练模型的时候,提供的训练集就要尽可能的包含多种同类事物(局部特征可能不同),让模型来自己学习他们的共性,从而获得泛化能力。
三、传统机器学习的训练和测试过程
在机器学习领域中,如果我们要对一个图片进行分类,想要让其具有良好的泛化能力,我们不能将原始的RGB图片直接作为输入,而是需要经过以下过程:
1.在训练的时候,首先要对图像进行特征提取,摒除一些干扰因素,例如杂乱的背景等等
2.使用分类算法进行训练,训练的时候用标签来计算损失,最后得到训练好的分类器(模型)。
3.测试时,同样要首先对图像做特征提取(要和训练时的特征提取操作一致),然后使用训练好的模型进行预测,得到预测值。
四、图像特征提取介绍
1.颜色特征
颜色特征是将图片的颜色做直方图,直方图就是其颜色分布的特征。
2.全局形状
通过PCA降维来提取全局形状特征,但是当形状旋转和扭曲的时候,效果不好。
3.局部形状
4.纹理
常用的图像特征有以下几种:
1.SIFT特征
SIFT是一种比较有用的特征,将一个区域划分为16格,每一个提取一个8维的梯度向量,然后将16个8维向量串起来得到一个128维的特征向量。主要用在图像分类和图像匹配等任务。
2.HOG特征
HOG主要用在目标检测领域,能够比较精确的将目标的形状给检测出来,所以在目标检测和跟踪方面用得比较多。
3.LBP特征
主要对人脸特征的提取比较好。
4.Harr特征
即角点特征,使用各种过滤器对图像进行处理,可以提取横向、纵向等方向的边界。
五、使用SVM来分类iris兰花
六、CNN结构初窥
相比于前面的机器学习对图像的分类来说,CNN可以将一个图片直接作为输入,然后通过卷积层和全连接层,就可以得到分类的输出,是一个端到端的过程。
七、深度学习中的激励函数
激励函数是一些非线性的函数,这些函数的特性有所不同:
1.Sigmoid函数可以将数值压缩到0-1的区间。
2.tanh可以将数值压缩到-1-1的区间。
3.Relu函数实现一个取正的效果,所有负数的信息都抛弃。
4.leaky Relu是一种相对折中的Relu,认为当数值为负的时候可能也存在一定有用的信息,那么就乘以一个系数0.1(可以调整或自动学习),从而获取负数中的一部分信息。
5.Maxout使用两套参数,取其中值大的一套作为输出。
6.ELU类似于Leaky Relu,只是使用的公式不同。
每一层的非线性激励函数组合起来,就可以形成一个非常复杂的非线性函数,也就可以有足够的能力来处理大量的信息(即可以保存大量的知识来指导分类)。
八、卷积运算过程
输入图像:32*32是图像的高和宽,其中的每一格是一个像素点,由于RGB图像有3个颜色通道,所以该图像的channel为3,一共就是32*32*3。
卷积核:卷积核的size一般是奇数*奇数,channel要与被卷积的图像相同,这里也为3。
特征图:就是卷积后的图像,宽和高一般情况下会变小(valid padding),但是我们可以通过padding的方式使之不发生变化,也就是“same”的padding方式。特征图的channel值应该是等于卷积核的个数,因为每一个卷积核对图像进行卷积,都会产生一个channel为1的矩阵,6个卷积核产生的结果就是6个图层的叠加,所以结果维度为28*28*6。
卷积的计算过程:
解释:
1.W0表示一个卷积核,大小是3*3*3,一共27个参数,这些参数都是通过BP算法来更新的。
2.卷积核的3和channel对应输入图像的3个channel,从第一格开始滑动,每次都计算自己覆盖的所有像素点,求他们的积,再求和。得到3个channel为1的矩阵。
3.注意上图中输入图像外围的灰色填充0,这就是padding,这样填充后,经过卷积计算,得到的结果矩阵与输入图像的高和宽一致,这叫“same” padding。
4.卷积核的3和channel分别得到的3个矩阵,在求和,可以得到一个高和宽与输入图像一致,channel为1的结果矩阵。
5.然后第二个卷积核W1再来做同样的操作,最终同样得到一个结果矩阵。
6.假设一共有6个卷积核,那么最终就会得到一个高宽与输入图像一致,channel为6的三维矩阵。
九、卷积层可视化
从上图可以看出,在接近输入层的卷积部分。提取到的图像特征很像前面机器学习用到的几种特征,所以在低级特征中,CNN就完成了各种常用特征的提取,并且将他们融合起来。
而更重要的是后面的中级特征和高级特征,这些特征是前面提到的机器学习特征很难获取的特征,这些特征才能真正表征一个图像的本质,从而提供给后面做精确的分类。
十、池化层
池化层实际上就是一个降采样的过程。
一般有两种常用的池化方式:
1.平均池化:Average pooling
2.最大池化:Max pooling
以最大池化为例:
池化的核通常采用2x2的大小,平均池化就是计算2x2范围内的平均值,最大池化就是取该范围内的最大值。目前比较常用的是最大池化。
在经过池化后,原图像的channel是不发生改变的。
十一、全连接层
在经过卷积层、池化层后得到的结果矩阵,我们通过将其压平(flatting)后,就可以输入全连接层。
如图所示,结果矩阵压平后得到一个1x3072的向量,然后输入到拥有10个节点的全连接层,得到一个1x10的输出(使用softmax激励函数),就将图像分为10类了。
十二、损失函数
1.交叉熵损失函数
交叉熵损失函数主要用于二分类问题,一般配合Sigmoid函数作为输出层。
2.Softmax损失函数
Softmax作为输出层,他的损失函数和交叉熵损失函数很像。交叉熵损失函数实际上的softmax在二分类时的特例。当只有分个分类时,y1 = 1-y0,a1 = 1-a0带入损失函数可以得到L = -∑[ y0loga0+(1-y0)log(1-a0)]。
3.欧式距离损失函数
主要用于回归任务。
4.对比损失函数
用于训练Siamese网络(暹罗网络)。用于人脸对比等方面。
5.Triplet损失
三元损失有3个输入,A,P,N。我们要使A和P之间的距离尽可能小,而A和N之间的距离尽可能大。
十三、训练网络的过程
1.首先我们的输入图片经过N层的卷积层、池化层进行特征提取。
2.得到的结果矩阵经过flatting,变为向量,然后输入全连接层进行分类。
3.通过训练集标签和每一轮的分类结果进行比对,使用损失函数计算损失值。
4.将损失值通过梯度下降的方式反向传播,更新全连接层的参数以及卷积层的卷积核参数。
5.不断迭代,知道损失值变得收敛(变得很小,达到我们的预期),即逼近最优解。