目录
一、图像分类
所谓图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像。
如何写一个图像分类的算法呢?
1、数据驱动方法
给计算机很多数据,然后实现学习算法,让计算机学习到每个类的外形。这种方法,就是数据驱动方法。既然该方法的第一步就是收集已经做好分类标注的图片来作为训练集,那么下面就看看数据库到底长什么样:
2、图像分类流程
- 输入:输入是包含N个图像的集合。里面有每个图像的像素值和每个图像的标签,每个图像的标签是K种分类标签中的一种。这个集合称为训练集。
- 学习:这一步的任务是使用训练集来学习每个类到底长什么样。一般该步骤叫做训练分类器或者学习一个模型。
- 评价:让分类器来预测它未曾见过的图像的分类标签,并以此来评价分类器的质量。我们会把分类器预测的标签和图像真正的分类标签对比。毫无疑问,分类器预测的分类标签和图像真正的分类标签如果一致,那就是好事,这样的情况越多越好。
3、Nearest Neighbor分类器(最近邻分类器)
虽然这个分类器和卷积神经网络没有任何关系,实际中也极少使用,但通过实现它,可以让读者对于解决图像分类问题的方法有个基本的认识。
Nearest Neighbor算法,其思想是根据像素差异,从训练集中选出的一张与测试集最类似的图片。
具体如何比较两张图片呢?
- 最简单的方法就是逐个像素比较,最后将差异值全部加起来。即计算L1距离(曼哈顿距离):
如果两张图片一模一样,那么L1距离为0,但是如果两张图片很是不同,那L1值将会非常大。 - 另一个常用的方法是L2距离(欧式距离):
4、k-Nearest Neighbor分类器(KNN)
它的思想很简单:与其只找最相近的那一个图片的标签,我们找最相似的k个图片的标签,然后让他们针对测试图片进行投票,最后把票数最高的标签作为对测试图片的预测。
5、交叉验证
分类器中存在不同的超参数(比如k值或距离类型的选取),要想选取好的超参数不是一件轻而易举的事。
选取超参数的正确方法是:将原始训练集分为训练集和验证集,我们在验证集上尝试不同的超参数,最后只在测试集上跑一次并报告结果。
有时候,训练集数量较小(因此验证集的数量更小),人们会使用一种被称为交叉验证的方法。比如,将原始训练集平均分成5份,其中4份用来训练,1份用来验证。然后我们循环着取其中4份来训练,其中1份来验证,最后取所有5次验证结果的平均值作为算法验证结果。
6、KNN的优缺点
-
优点:
1、实现简单
2、训练不需要太多时间,只是将训练集的图像像素存储起来 -
缺点:
1、测试花费大量时间,因为测试集要与训练集中的数据进行比较
-
结论:
KNN很少使用:使用像素差异来比较图像是不够的。
预测集与训练集的排布更像是一种颜色分布函数,或者说是基于背景的,而不是图片的语义主体。比如,狗的图片可能和青蛙的图片非常接近,这是因为两张图片都是白色背景。从理想效果上来说,我们肯定是希望同类的图片能够聚集在一起,而不被背景或其他不相关因素干扰。
二、线性分类
由于KNN分类器的不足,我们将要实现一种更强大的方法来解决图像分类问题,该方法可以自然地延伸到神经网络和卷积神经网络上。
这种方法主要有两部分组成:一个是评分函数(score function),或假设函数。它是原始图像数据到类别分值的映射。另一个是损失函数(loss function),或代价函数,它是用来量化预测分类标签的得分与真实标签之间一致性的。该方法可转化为一个最优化问题(正则化),在最优化过程中,将通过更新评分函数的参数来最小化损失函数值。
1、线性分类器的评分函数
在上面的公式中,假设每个图像数据都被拉长为一个长度为D的列向量 xi,大小为[D x 1]。其中大小为[K x D]的矩阵 W 和大小为[K x 1]列向量 b为该函数的参数(parameters)。K为分类器的类别数目。
需要注意的几点:
- 首先,每个类的分类器就是W的一个行向量。每个类别的分值就是权重(W)和像素(xi)的矩阵乘。
- 偏差和权重的合并技巧。
分开处理这两个参数(权重参数W和偏差参数b)有点笨拙,一般常用的方法是把两个参数放到同一个矩阵中,同时 xi 向量就要增加一个维度,这个维度的数值是常量1,这就是默认的偏差维度。这样新的公式就简化成下面这样: - 卷积神经网络映射图像像素到分类分值的方法和上面一样,只是映射f 要复杂得多,参数也多。
2、损失函数
损失函数(Loss Function)(有时也叫代价函数Cost Function或目标函数Objective)来衡量我们对结果的不满意程度。直观地讲,当评分函数输出结果与真实结果之间差异越大,损失函数输出越大,反之越小。
介绍一下常用的多类支持向量机(SVM)损失函数。
针对第j个类别的得分就是第j个元素:
针对第i个数据的多类SVM的损失函数定义如下:
简而言之,SVM的损失函数想要正确分类类别 yi 的分数比不正确类别分数高,而且至少要高 △。
举例:
假设有3个分类,并且得到了分值 s=[13,-7,11]。其中第一个类别是正确类别。同时假设 △ 是10。上面的公式是将所有不正确分类( j ≠ yi)加起来,所以我们得到两个部分:
可以看到第一个部分结果是0,这是因为[-7-13+10]得到的是负数,经过 max(0, -) 函数处理后得到0。这一对类别分数和标签的损失值是0,这是因为正确分类的得分13与错误分类的得分-7的差为20,高于边界值10。而SVM只关心差距至少要大于10,更大的差值还是算作损失值为0。第二个部分计算[11-13+10]得到8。虽然正确分类的得分比不正确分类的得分要高(13>11),但是比10的边界值还是小了,分差只有2,这就是为什么损失值等于8。
补充:
max(0, -) 函数,它常被称为折叶损失(hinge loss)。
3、正则化
解决过拟合问题。
最常用的正则化惩罚是L2范式,L2范式通过对所有参数进行逐元素的平方惩罚来抑制大数值的权重:
完整的多类SVM损失函数,它由两个部分组成:数据损失(data loss),即所有样例的的平均损失 Li ,以及正则化损失(regularization loss)。完整公式如下所示:
将其展开完整公式是: