#cs231n#1.最近邻分配器Nearest Neighbor
The Image Classification Pipeline
The image classification pipeline. We’ve seen that the task in Image Classification is to take an array of pixels that represents a single image and assign a label to it. Our complete pipeline can be formalized as follows:
Input: Our input consists of a set of N images, each labeled with one of K different classes. We refer to this data as the training set.
Learning: Our task is to use the training set to learn what every one of the classes looks like. We refer to this step as training a classifier, or learning a model.
Evaluation: In the end, we evaluate the quality of the classifier by asking it to predict labels for a new set of images that it has never seen before. We will then compare the true labels of these images to the ones predicted by the classifier. Intuitively, we’re hoping that a lot of the predictions match up with the true answers (which we call the ground truth).
其实就是
- 输入TrainingSet的图片和标签
- 让机器去学习这个模型model,training分类器
- 利用第二步得到的classifier算法对输入的test图片进行处理,然后输出得到机器估计的test图片的标签
Data-Driven Approach
provide the computer with many examples of each class and then develop learning algorithms that look at these examples and learn about the visual appearance of each class
也就是利用大量数据,开发学习算法,令电脑能够读取和获得数据中的共性,然后利用这些共性去进行下一步的判断
最近邻分配器
思想即为求出每一个training矩阵和同一个test矩阵之间的distance,然后找到其中最小的distance,这个即为最近的邻,找到这个最近的邻之后,按照其对应的属性对test进行分类。
k-NN classifier
每次分类的时候,得到最接近的k个邻,然后根据这k个邻按照一定的权重比较后,得到比较合理的值
例如k=5时候
得到最后接近的5个邻为[cat,cat,cat,cat,dog]那么这个时候应该得把该test的类标记为cat,因为与cat的相关性更大。
代码思想
- 读入一个四维数组(1全部的train2px3R4G5B),然后reshape降成二维数组(1包含数组全部的train2一张图片包含px个数*3(即RGB))xtr.shape[0]代表总图片数
- zeros初始化数组,用xrange()返回而不用range()返回是因为xrange是一个生成器,效率远高于range这种返回整个数组的函数
for i in xrange(num_test):
-
distances = np.sum(np.abs(self.Xtr - X[i,:]), axis=1);
每行减去同一个test然后求和得到一组distance数组 -
min_index = np.argmin(distances)
得到数组中最小元素的下标 -
Ypred[i] = self.ytr[min_index]
将下标对应的label赋值给predict的label
Hyperparameters超参数
The k-nearest neighbor classifier requires a setting for k. But what number works best? Additionally, we saw that there are many different distance functions we could have used: L1 norm, L2 norm, there are many other choices we didn’t even consider (e.g. dot products). These choices are called hyperparameters and they come up very often in the design of many Machine Learning algorithms that learn from data
感觉超参数就是一种未定的参数,例如knn里面的k或者里面的distance或者px点之间的关系等等各种无限可能的参数。现在学的比较少,所以了解也不多,以后再慢慢深入吧。
如果我们使用从头到尾使用同一组数据去调试超参数,很有可能会出现过拟合现象(overfit,一个假设在训练数据上能够获得比其他假设更好的拟合,但是在训练数据外的数据集 上却不能很好的拟合数据。
为了实现更好的算法,逐渐调整和测试超参数是很有必要的。
Validation 检验用的数据
抽出数据的小一部分去作为对training结果的检测,即在数据集里面抽出一小部分作为假的test,这样做的好处在于即时检验。
Cross-Validation
这是一种hyperparameter tuning,是一种对Hyperparameter进行调试和修正的方法。
一种情况是缺少数据的时候才用。
是将一组数据分成N组,然后将这N组数据轮流当做validation去使用。
可以提高精确度。但是会使用大量的时间和空间资源。
在最后的实际估计的时候不会去浪费资源使用,但是选择合适hyperparameters的时候要用。(个人觉得这个一定要用,因为精确估算的时候作用比较大)
NNC的局限性
在数据是低维度的时候比较有用,但在图像处理这种高维度的作用不大,而且有很多干扰因素。通过像素差异去判断图像是很不合适的。对每一个像素点都取样的话,很可能会因为背景或者大体颜色相同就判断为同一个类型。但是这种思想挺重要的
选区_002.png