cs231n之KNN算法

1.环境搭建以及前置条件

  • 1.前置环境:
    • 1.mac
    • 2.pycharm
    • 3.python3
    • 4.Anaconda
  • 2.环境搭建:
    • 1.官网下载并安装Anaconda
    • 2.官网下载并安装pycharm
    • 3.在pycharm中使用Anaconda
      • 1.preference-->project-->project interpreter
      • 2.将Anaconda的解释器当做一个project interpreter添加
    • 4.下载assignment1作业项目并导入pycharm中,作业下载
    • 5.下载数据集并解压到assignment1作业项目的 assignment1/cs231n/datasets/中。数据集下载
    • 6.执行数据集中的.sh文件使得数据集可用
  • 3.前置知识:numpy、python、SciPy基础学习,教程

2.KNN知识了解

1.两张图片的图片距离

对于两张图片来说我们如何量化这两张图片的相似度呢?计算机科学家给出了两个简单的方法:曼哈顿距离和欧氏距离

  • 1.L1距离(曼哈顿距离):给定两张 32*32 像素的图片i1和i2,那么可以将其看做两个 32*32 的矩阵。公式:

曼哈顿距离公式 解释:两个矩阵相减之后,再对该矩阵的所有值取绝对值,最后将该矩阵所有值相加。最后得出的值就是两张图片的距离。

  • 2.L2距离(欧氏距离):还是给定两张 32*32 像素的图片i1和i2,将这两张图片一维化,即拉伸成一个1024*1的矩阵。公式:

欧式距离公式 解释:在一个二维的坐标系中A(x1 , y1),B(x2 , y2)这两点的距离公式是:

二维欧氏公式 ,那么这两个矩阵的距离就可以推广为在一个1024维的坐标系上两点的距离

2.KNN的基本思想

从1中我们可以根据公式计算出两张图片的相似度在接下来设为A,我们再假设我们有n张可供训练的图片每张图片被称为Tn,对于训练图片我们都知道该图片到底属于哪个种类的图片,如猫、狗等,所以这里设第Tn张图片的种类为CTn。然后有m张可供测试的图片,每张图片被称为Cm,对于测试图片我们也知道该图片到底属于哪个种类,所以这里设第Cm张图片的种类为CCm。那么某张测试图片和某张训练图片的相似度就可以被称为Anm

  • 1.对于某一Cm来说,我们需要与每一Tn进行相似度计算,此时对于该Cm来说就有nAnm
  • 2.从1中的nAnm中取出k个最小值,这里的意思为为Cm找出最相似的k张图片。此时获取的Anm我们称为Akm
  • 3.因为我们知道每个Tn的种类,所以此时我们为Cm找到了kCTn,也就是与该图片最相似的k个种类
  • 4.由于CmkCTn中可能会有重复的种类,所以我们要对这k个种类进行统计,最终找出数量最多的种类,此时这个种类就是我们预测该图片的种类,这里我们记该种类为CmCTn
  • 5.上面1-4我们只是对某一张测试图片进行了预测,接下来我们就按照上面的操作,对所有测试图片进行同样的操作,此时我们就能获取到mCmCTn
  • 6.最后就是计算KNN的准确率了,因为我们知道每个Cm的种类,所以可以判断出mCmCTn中哪些是预测正确的,哪些是预测错误的,继而算出KNN的准确率

3.KNN代码

1.我的项目

  • 1.先上一个github吧,会持续更新直到把cs231n课程学习完:cs231n
  • 2.我的项目目录:

项目目录

2.代码解析

展示一下整体的KNN算法流程等等会按照这个图中代码一行行向下讲,建议结合github上面的代码食用更佳。

KNN算法

  • 1.导入几个常见的和我定义模块:numpy、pyplot、load_cifar10(我写的读取文件用的)、KNearestNeighbor(KNN的具体算法)
  • 2.通过load_cifar10 获取到数据,我定义一个cs231n/classifiers/data_util.py的文件用来作为数据读取工具类。

data_util

  • 1.我们从load_cifar10这个方法讲起:先定义了两个数组xsys
  • 2.进入一个循环,从我的目录截图我们可以看见,数据文件的命名是data_batch_?,后面的问号表示1-5.
    • 1.先获取到某个数据文件名
    • 2.将文件传入到load_cifar_batch方法中去从中获取数据
      • 1.打开该文件
      • 2.使用pickle库将文件以字节流的形式读入内存,并且反序列化成numpy的对象
      • 3.定义x,y分别为numpy的图片矩阵数组 和 numpy的图片类型数组,每张图片都对应着一个图片类型,如猫、狗等等
      • 4.将x图片矩阵数组重新展开成,10000张图片每张图片为32*32*3像素。
      • 5.将y展开成与x中10000张图片一一对应的图片类型
      • 6.返回x,y
    • 3.获取到某个文件中的全部图片矩阵数组和全部图片类型数组之后,将其放入前面数组中,就这样一直循环,直到所有的文件数据都被放入到数组中
  • 3.将xs和ys这连个数组平铺,也就是最后获取到了 50000张32*32*3像素的图片和对应图片的类型。
  • 4.将测试数据,进行上面一样的操作,最后返回获取到的数据

  • 2.展示一下数据的信息,看看读取是否有问题
  • 3.定义训练图片数量num_training,这里大家可以减少一些从而减少训练所需时间
  • 4.获取到mask这个数值num_training的范围,然后获取到具体需要的训练图片数量和对应图片类型x_trainy_train
  • 5.定义测试图片的数量num_test,同理获取具体的x_testy_test
  • 6.将测试图片和训练图片降维,例如把原来10000*32*32*3的矩阵伸张成10000*3072的矩阵,也就是将每张图片平铺成一个一维数组,这样在后面计算的时候更加方便。
  • 7.定义一个KNN的分类器classifier,将x_train,y_train放入其中,等等接下来的训练
  • 8.前面我们在KNN的基本思想中提到了,对于一张测试图片来说,我们计算了其与全部测试图片的距离,然后会取出前k个距离最小的图片,所以这里我们定义了一个k从1-10的数组,称为ks.
  • 9.定义一个num_correct数组,用来储存在不同的k下,正确预测的测试图片数量
  • 10.定义一个accuracy数组,用来储存在不同的k下,预测成功的概率
  • 11.进入一个循环,循环在不同的k下的结果
    • 1.用上了前面定义的分类器,传入测试图片集和当前的k:

    预测图片结果

    • 1.这里有三种不同的方式来计算图片的L2距离,我们这里讲解比较简单的一种,方便读者了解。当num_loops=2的时候就是我们要讲的方法:

    两次循环计算L2距离

    • 1.先获取测试图片的数量num_test,再获取训练图片的数量num_train
    • 2.建立一个num_test*num_train大的矩阵dists,用来储存接下来计算出的L2距离
    • 3.两层循环嵌套以然后用前面说到的公式计算L2距离,然后将结果储存到对应的dists
    • 4.将dists返回

    • 2.获取到了L2距离矩阵之后,将其与k传入predict_labels方法中,用来获取每张测试图片的预测图片种类:

    获取预测的图片种类

    • 1.获取到测试图片的数量num_test
    • 2.定义一个num_test大的数组y_pred用于储存预测图片种类结果
    • 3.进入循环中
      • 1.先在dists中对第i张测试图片的全部L2距离进行从小到大排序,获得了数组y_indicies
      • 2.截取前k个第i张测试图片的L2距离,得到了closest_y
      • 3.最后找到第i张测试图片的closest_y中数量最多的图片类别,存入y_pred中。
    • 4.返回预测的结果数组

    • 2.回到初始调用的地方,此时我们已经获取了在当前的k下,全部的测试图片的预测结果。将预测结果与实际结果进行比较,获取到了预测成功的数量num
    • 3.向num_correct中添加当前的结果,向accuracy添加当前的准确率
  • 12.以k为自变量,accuracy为因变量,绘制出曲线并寻找在k为多少的时候,预测的准确率最高。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏AI研习社

利用卷积自编码器对图片进行降噪

前言 这周工作太忙,本来想更把 Attention tranlsation 写出来,但一直抽不出时间,等后面有时间再来写。我们这周来看一个简单的自编码器实战...

40740
来自专栏Small Code

【TensorFlow】TensorFlow 的卷积神经网络 CNN - 无TensorBoard版

前面 有篇博文讲了多层感知器,也就是一般的前馈神经网络,文章里使用 CIFAR10 数据集得到的测试准确率是 46.98%。今天我们使用更适合处理图像的卷积神经...

29870
来自专栏杨熹的专栏

TensorFlow-1: 如何识别数字

识别数字在机器学习任务中的地位和 Hello World 在编程中是一样的。 主要步骤: 获得数据:from Yann LeCun's website 建立模型...

45070
来自专栏菩提树下的杨过

WPF中的MatrixTransform

WPF中的MatrixTransform            周银辉 虽然在WPF中可以使用TranslateTransform、RotateTrans...

220100
来自专栏AILearning

TF图层指南:构建卷积神经网络

TensorFlow layers模块提供了一个高级API,可以轻松构建神经网络。它提供了便于创建密集(完全连接)层和卷积层,添加激活函数以及应用缺陷正则化的方...

84450
来自专栏Petrichor的专栏

matplotlib: 绘制平面图/表格

46840
来自专栏数据派THU

从零开始用Python构造决策树(附公式、代码)

? 来源:Python中文社区 作者:weapon 本文长度为700字,建议阅读5分钟 本文介绍如何不利用第三方库,仅用python自带的标准库来构造一个决策...

37780
来自专栏fangyangcoder

tensorflow笔记(四)之MNIST手写识别系列一

http://www.cnblogs.com/fydeblog/p/7436310.html

15010
来自专栏深度学习与计算机视觉

TensorFlow 网络优化步骤与一般方法

深度学习中,网络的优化是训练过程中很重要的一部分,现在有很多的优化策略,而他们的核心的内容都是梯度下降。 理论的部分大家可以参考: 理解梯度下降在机器学...

672100
来自专栏Spark学习技巧

译:Tensorflow实现的CNN文本分类

19050

扫码关注云+社区

领取腾讯云代金券