图像分类的基本任务就是将图片分类,那如何进行图片分类呢?图片是不可能直接当作输入传递给我们的机器学习任务的,一个通用的做法就是将图片转换成一张巨大的数字表单。这时候输入有了,那么就可以使用机器学习的算法从所有种类中,给这个表单选定一个标签。 图像分类的难题在于我们所说的语义鸿沟问题
我们人眼所看到的是一个完整的图像画面,但是计算机所看到的是一张巨大的数字表单,表单的数字反映的是亮度以及每个单点三基色的权值。图像分类难点就在于要去处理这个巨大的表单,然后根据其进行分类。 下面列出了一些其它方面的挑战:
该数据集共有60000张彩色图像,这些图像是32*32,分为10个类,每类6000张图。这里面有50000张用于训练,构成了5个训练批,每一批10000张图;另外10000用于测试,单独构成一批。
现在我们用CIFAR-10的50000张图片作训练集,训练模型,然后Nearest Neighbor算法用测试图片和训练集中每一张图片去比较,然后将它认为最近邻的一个样本的类别来决定待分样本所属的类别。 那最近邻是怎么判断的呢?最简单的方式就是曼哈顿距离算法,即L1距离算法,计算方式如下:
distance
下面就是使用L1距离的Nearest Neighbor分类器的实现套路:
import numpy as np
class NearestNeighbor(object):
def __init__(self):
pass
def train(self, X, y):
""" X is N x D where each row is an example. Y is 1-dimension of size N """
# the nearest neighbor classifier simply remembers all the training data
self.Xtr = X
self.ytr = y
def predict(self, X):
""" X is N x D where each row is an example we wish to predict label for """
num_test = X.shape[0]
# lets make sure that the output type matches the input type
Ypred = np.zeros(num_test, dtype = self.ytr.dtype)
# loop over all test rows
for i in xrange(num_test):
# find the nearest training image to the i'th test image
# using the L1 distance (sum of absolute value differences)
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis = 1)
min_index = np.argmin(distances) # get the index with smallest distance
Ypred[i] = self.ytr[min_index] # predict the label of the nearest example
return Ypred
其实我们可以看到,分类器的时间复杂度是和样本的大小有关系的,它是一个线性的减慢的过程。近邻算法分类器速度加快的方法,可以用一个近似近邻算法FLANN。 距离选择:计算向量间的距离有很多种方法,另一个常用的方法是L2距离,从几何学的角度,可以理解为它在计算两个向量间的欧式距离。
为什么只用最相似的1张图片的标签来作为测试图像的标签呢?这不是很奇怪吗!是的,使用k-Nearest Neighbor分类器就能做得更好。它的思想很简单:与其只找最相近的那1个图片的标签,我们找最相似的k个图片的标签,然后让他们针对测试图片进行投票,最后把票数最高的标签作为对测试图片的预测。所以当k=1的时候,k-Nearest Neighbor分类器就是Nearest Neighbor分类器。从直观感受上就可以看到,更高的k值可以让分类的效果更平滑,使得分类器对于异常值更鲁棒。 设置参数