您的位置:首页 > 其它

【机器学习(1)】图像识别中的最近邻分类和knn分类

2017-04-06 15:26 281 查看
对于识别图像分类问题,我们怎么判断输入一张图片具体归于哪一类呢?

假如给你一张猫的照片,你会怎么去分辨这是一只猫?最简单的思路就是:它和现有的猫的相似程度。

但是,这里有个问题,对于人来说,认识这只猫可以通过:猫有爪子,有胡须,耳朵是什么样的,鼻子是什么样的,多大等等特征。

但是,对于机器呢?图片对它们来说,只是一张标明了描述哪一点是什么颜色的矩阵而已!

没办法像定义数组排序这种算法一样去给计算机定义一只猫的图像特征,这时候我们希望,通过机器学习来完成这个过程。交给机器一堆猫的图片,跟它说,这个是猫,这个也是猫……就像教给孩子一样,让它自己去慢慢学会判别。

那机器要怎么学习图片的知识呢?

最简单的一个算法,叫 最邻近分类器 Nearest Neighbor Classifier

名字挺唬人的,但机器学习领域里面名词大都如此。其实原理非常非常简单。

首先,我们定义一个概念:图片的距离

图片为啥会有距离?大家知道图片是矩阵,那我们很简单地把两张图片矩阵相应位置的元素做一下减法,然后把得到的结果矩阵的所有元素的求一下绝对值加起来……表示为公式如下。



好了,这玩意我们就叫做距离吧(实际上也叫,曼哈顿距离)。

一定程度上,它就反映了图片之间的差距。

具体的实现怎么做?其实都羞于说这玩意是学习,因为它就是简单地把数据集保存了起来……我们想判断一张新图片时,就与现有数据集中所有的数据计算距离,选出距离最小的一个,输出这个图片的类别作为判断类别。(超简单啊有没有)

实验证明(CIFAR-10数据集)这个算法有着36.8%的准确率!好吧瞎猜也有10%,人眼识别有94%……但我们现在的目的是从这个算法出发,探寻更有效率的算法。

为什么会这样?因为我们选择的距离是“一定程度上反应图片之间的差距”。这个“一定程度”很微妙……因为挺鸡肋的,大家可以想一想,这个距离判断的是什么。对,是像素的相似度(或者近似理解为“颜色特征”)。也就是说,如果判断纯色图片,那这个简直不要太靠谱,但是一只猫和一只狗的差距可能就没那么明显了……

下面的图片是根据距离来排布的,也就是挨得越近的图片距离越小,大家可以看出,“距离”大多指的是颜色分布。像素级别接近的图片,在整张图的颜色分布上,有很大的共性,然而在图像内容上,有时候也只能无奈地呵呵嗒。



那怎么进行优化呢?

这时候引入knn了。虽然跟cnn(卷积神经网络)和dnn(深层神经网络)看上去差不多,但这玩意全称其实是K Nearest Neighbor Classifier,就比前面那个算法前面加了一个k。

具体的实现也很简单,原来是选出最近的,现在选出k个最近的,然后看这k个选出的邻居都是什么类别,选出邻居属于最多的类别。比如k=5的时候,一张图片选出了猫,狗,狗,汽车,狗,那么我们最终的结果就是狗了。

k怎么选呢?这个值就不是让机器决定了,而是程序猿的活。

实际上,这个工作叫做调参,区别于机器调节参数(在这两个算法里并没有体现,知道线性回归梯度下降的读者可能了解),我们调节的是所谓“超参数”,也就是“参数的参数”。

举例来说就是这个例子的k,和神经网络的层数神经元数目,或者是梯度下降的步长等。

具体怎么做?

……

试几次选最高辨识率的k呗……还能咋办。

K最近邻的优点大家都看出来了,思路非常简单清晰,而且完全不需要训练…不过也正因为如此,最后的predict过程非常耗时,因为要和全部训练集中的图片比对一遍。

实际应用中,我们其实更加关心实施predict所消耗的时间,如果有一个图像识别app返回结果要半小时一小时,你一定第一时间把它卸了。我们反倒不那么在乎训练时长,训练时间长一点没关系,只要最后应用的时候识别速度快效果好,就很赞。后面会提到的深度神经网络就是这样,深度神经网络解决图像问题时训练是一个很耗时间的过程,但是识别的过程非常快。

本文是学习了龙心尘大大的博客总结而来,愿意深入了解可以戳进去~
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: