当前位置:   article > 正文

手把手教你K最近邻分类器分类CIFAR-10_knn分类cifar10

knn分类cifar10

KNN算法全称为k-Nearest Neighbor Classifier,即k最近邻分类器。它可以看作是Nearest Neighbor Classifier最近邻分类器的加强版,无论是最近邻分类器还是k最近邻分类器,其原理都比较简单,其算法在CIFAR-10图像分类的效果上其正确率远低于人类识别图像的正确率(约94%),但也略高于随即猜测的10%的正确率(CIFAR-10有10个分类,随机猜测的正确率为10%)。

基于最近邻分类器的CIFAR-10的图像分类

CIFAR-10可视化 可参考:https://blog.csdn.net/qq_36552550/article/details/105835108

1.最近邻分类器原理

前面的CIFAR可视化将200副图像保存在了10个文件夹当中,观察ship文件夹中的前两幅图片“8.jpg”以及“62.jpg”,如图1所示。直观上来看,天空和大海都是蓝色的,船则是白色的,位于图像正中间;照此推理,相似的类别的图像,比如船,图像大致是类似的。

图5-3-1 ship文件夹中前两幅图像对比

那么,要判断test_batch中的某一幅图像属于哪一个类别,可以将该图像和data_batch1至data_batch5的图像依次比对,找出最相似的一副图像,这样就认为该图像和最相似图像属于一个类别。

具体实现上,将test_batch中的图像的每一个像素的RGB数值依次减去data_batch1至data_batch5的图像的每一个像素的RGB数值,将相减的数求绝对值,然后将所有的绝对值相加,得出和值,依照这个和值的大小来判断两幅图像的相似度;两幅图像相似程度越高,这个和值应该越低。以此,可以推断test_batch中图像属于哪一个类别。

该过程可以视作求取两向量L1距离的过程。因为每幅图像在CIFAR-10中以行向量进行保存,则可认为两幅图像为两个向量I1、I2,求两向量的L1距离即可得出结果:

(L1距离为求差值的绝对值,而L2距离则是求平方和的开平方;这里使用L1距离的好处就是计算量更小)

 Numpy的广播机制、sum()函数以及argmin()函数

test_batch文件同样是一行代表一副图片,然后将该行依次减去data_batch_1至5的每一行,如果将data_batch_1至5的图像数据全部拼接在一起,相当于是一个1*3072的数组减去一个50000*3072的数组的每一行。这里面就涉及两个编程实现的问题——1.data_batch_1至5的数据拼接;2.一个1*3072的数组减去一个50000*3072的数组的每一行的实现。

首先,看一下数据拼接的问题。将data_batch_1至5文件中字典dictionary类型里面的图像数据和标签读出,读出后为列表list类型,进行计算的时候需要提前将list类型转换成Numpy的array类型,并且维度也要符合50000*3072需要。

接下来看一个简单的程序例子,如程序1所示。

程序1 数据拼接示例

  1. import numpy as np
  2. x = []
  3. a = [[1,2],[3,4]]
  4. b = [[5,6],[7,8]]
  5. print(a)
  6. print(b)
  7. x.append(a)
  8. print(x)
  9. x.append(b)
  10. print(x)
  11. xb = np.array(x)
  12. print(xb)
  13. print(xb.shape)
  14. xa = np.concatenate(x)
  15. print(xa)
  16. print(xa.shape)

首先看第2行至第11行,通过append()函数,列表x依次将列表a和列表b放入自己的列表中;如图2所示。

图2 列表x续接结果示

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/小蓝xlanll/article/detail/187590
推荐阅读
相关标签
  

闽ICP备14008679号