内容参考自:https://zhuanlan.zhihu.com/p/20894041?refer=intelligentunit

用像素点的rgb值来判断图片的分类准确率并不高,但是作为一个练习knn的题目,还是挺不错的。

1. CIFAR-10

CIFAR-10是一个图像分类数据集。数据集包含60000张32*32像素的小图片,每张图片都有一个类别标注(总共有10类),分成了50000张的训练集和10000张的测试集。

然后下载后得到的并不是实实在在的图片(不然60000张有点可怕...),而是序列化之后的,需要我们用代码来打开来获得图片的rgb值。

 import pickle

 def unpickle(file):
with open(file, 'rb') as f:
dict = pickle.load(f, encoding='latin1')
return dict

由此得到的是一个字典,有data和labels两个值。

data:

一个10000*3072的numpy数组,这个数组的每一行存储了32*32大小的彩色图像。前1024个数是red,然后分别是green,blue。

labels:
一个范围在0-9的含有10000个数的一维数组。第i个数就是第i个图像的类标。

2. 基于曼哈顿距离的1NN分类

这个训练文件很大,如果全部读的话会占据很多内存...第一次全部读直接内存爆炸直接死机。所以这里我就读了一个文件的内容。

 #! /usr/bin/dev python
# coding=utf-8
import os
import sys
import pickle
import numpy as np def load_data(file):
with open(file, 'rb') as f:
datadict = pickle.load(f, encoding='latin1')
X = datadict['data']
Y = datadict['labels']
X = X.reshape(10000, 3, 32, 32).transpose(0, 2, 3, 1).astype('float')
Y = np.array(Y)
return X, Y def load_all(root):
xs = []
ys = []
for n in range(1, 2):
f = os.path.join(root, 'data_batch_%d' %(n,))
X, Y = load_data(f)
xs.append(X)
ys.append(Y)
X_train = np.concatenate(xs) #转换为行向量
Y_train = np.concatenate(ys)
del X, Y
X_test, Y_test = load_data(os.path.join(root, 'test_batch'))
return X_train, Y_train, X_test, Y_test def classTest(Xtr_rows, Xte_rows, Y_train):
count = 0
numTest = Xte_rows.shape[0]
result = np.zeros(numTest) #构造一维向量的结果
for i in range(numTest):
distance = np.sum(np.abs(Xtr_rows - Xte_rows[i,:]), axis=1)
min_dis = np.argmin(distance)
result[i] = Y_train[min_dis]
print('%d: %d' %(count, result[i]))
count += 1
return result if __name__ == '__main__':
X_train, Y_train, X_test, Y_test = load_all('D:\学习资料\机器学习\cifar-10-python\\')
Xtr_rows = X_train.reshape(X_train.shape[0], 32 * 32 * 3)
Xte_rows = X_test.reshape(X_test.shape[0], 32 * 32 * 3)
result = classTest(Xtr_rows, Xte_rows, Y_train)
print('accuracy: %f' % (np.mean(result == Y_test)))

最后测试结果如下:(跑了很久...)

3. KNN

有了上面的基础,接下来要实现最KNN就很简单了,保存与测试数据最接近的k个数据,最后选出最多的即可。

 def classTest(Xtr_rows, Xte_rows, Y_train, k):
count = 0
numTest = Xte_rows.shape[0]
result = np.zeros(numTest) #构造一维向量的结果
for i in range(numTest):
classCount = {}
distance = np.sum(np.abs(Xtr_rows - Xte_rows[i,:]), axis=1)
distance = distance.argsort()
for j in range(k):
votelabel = Y_train[distance[j]]
classCount[votelabel] = classCount.get(votelabel, 0) + 1
sortedClassCount = sorted(classCount.items(), key=operator.itemgetter(1), reverse=True)
result[i] = sortedClassCount[0][0]
print('%d: %d' % (count, result[i]))
count += 1
return result

4. 验证

对于如何确定一个最佳的k值,我们就需要去做验证,需要注意的是测试集不能作为验证集去验证。一般来说就是将训练数据分为两部分,一部分作为验证集去确定最佳的k值,最后再去用该k值去测试。

如果数据不是很多的话,那么就可以用交叉验证来寻找最佳的k值,交叉验证就是将数据分为多份,依次选一份作为验证集,比如将训练数据分为5分,然后进行5次训练,每次将其中一份作为验证集,另外四份作为训练集。

KNN——图像分类的更多相关文章

  1. CS231n——图像分类(KNN实现)

    图像分类   目标:已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像.   图像分类流程 输入:输入是包含N个图像的集合,每个图像的标签是K ...

  2. 【cs231n作业笔记】一:KNN分类器

    安装anaconda,下载assignment作业代码 作业代码数据集等2018版基于python3.6 下载提取码4put 本课程内容参考: cs231n官方笔记地址 贺完结!CS231n官方笔记授 ...

  3. 基于Tensorflow + Opencv 实现CNN自定义图像分类

    摘要:本篇文章主要通过Tensorflow+Opencv实现CNN自定义图像分类案例,它能解决我们现实论文或实践中的图像分类问题,并与机器学习的图像分类算法进行对比实验. 本文分享自华为云社区< ...

  4. Atiti  attilax主要成果与解决方案与案例rsm版 v4

    Atiti  attilax主要成果与解决方案与案例rsm版 v4 版本历史记录1 1. ##----------主要成果与解决方案与 参与项目1 ###开发流程与培训系列1 #-----组织运营与文 ...

  5. 深度学习与计算机视觉系列(2)_图像分类与KNN

    作者: 寒小阳 &&龙心尘 时间:2015年11月. 出处: http://blog.csdn.net/han_xiaoyang/article/details/49949535 ht ...

  6. 图像分类与KNN

    1 图像分类问题 1.1 什么是图像分类 所谓图像分类问题,就是已有固定的分类标签集合,然后对于输入的图像,从分类标签集合中找出一个分类标签,最后把分类标签分配给该输入图像.虽然看起来挺简单的,但这可 ...

  7. Scikit-Learn实战KNN

    Scikit-Learn总结 Scikit-Learn(基于Python的工具包) 1.是一个基于Numpy,Scipy,Matplotlib的开源机器学习工具包. 2.该包于2007年发起,基本功能 ...

  8. CS231n学习笔记-图像分类笔记(下篇)

    原文地址:智能单元 K-Nearest Neighbor分类器 大家可能注意到了,为什么只用最相似的一张图片的标签来作为测试图像的标签呢?这不是很奇怪吗!是的,使用K-Nearest Neighbor ...

  9. 【cs231n】图像分类-Linear Classification线性分类

    [学习自CS231n课程] 转载请注明出处:http://www.cnblogs.com/GraceSkyer/p/8824876.html 之前介绍了图像分类问题.图像分类的任务,就是从已有的固定分 ...

随机推荐

  1. flask模板结构组织(局部模板、宏、模板继承)

    模板结构组织 除了使用函数.过滤器等工具控制模板的输出外,jinja2还提供了一些工具来在宏观上组织模板内容. 局部模板 在Web程序中,我们通常会为每一类页面编写一个独立的模板.比如主页模板.用户资 ...

  2. git log的常见用法

    git log 使用git log命令,什么参数都没有的话,会以下面的格式输出所有的日志(我当前的git仓库只有三个提交).如果日志特别多的话,在git bash中,按向下键来查看更多,按q键退出查看 ...

  3. 51Nod 1069 Nim游戏 (位运算)

    题目链接:https://www.51nod.com/onlineJudge/questionCode.html#!problemId=1069 有N堆石子.A B两个人轮流拿,A先拿.每次只能从一堆 ...

  4. What Would you Find out about MS908CV ?

    The Autel MaxiSYS commercial car diagnostics scan device, No. MS908CV, performs increased technique ...

  5. JDK 的配置和反编译工具的使用---------------Java知识点

    初始Java 1995年5月,sun公司开发了一门新的编程语言------Java 詹姆斯.高斯林(Java之父),Java语言小巧安全具有可移植可跨平台性的优点. 开发java程序的步骤:编写 ,编 ...

  6. 手头没证书,如何给https做代理?Nginx TCP转发

    线上的一个海外充值接口(https)经常因我朝网络问题中断,想借助hk的机器做个https反向代理又没证书. 一开始 一开始想到的办法是借助Nginx的tcp转发进行代理: 编译NGINX时加入 -- ...

  7. bzoj3932 / P3168 [CQOI2015]任务查询系统(主席树+差分)

    P3168 [CQOI2015]任务查询系统 看到第k小,就是主席树辣 对于每一段任务(a,b,k),在版本a的主席树+k,版本b+1的主席树-k 同一时间可能有多次修改,所以开个vector存操作, ...

  8. nginx动静态分离以及配置https(安全组强行切换以及导致的问题解决)

    公司原来的网络采用http/https同时支持的方式,http并不会强制自动跳转到https,最近要求强制切换,导致了一系列问题.趁今天测试完成了,整理如下: 1.要求HTTP自动跳转到HTTPS: ...

  9. 监控mysql状态脚本

    监控mysql状态, 发现宕后, 自动重启, 每秒检查一次. check.sh #!/bin/bash while [ true ]; do /bin/sleep 1 sh mysql_status. ...

  10. android之进度条

    xml引用 <ProgressBar android:id="@+id/pb_progressbar" style="@style/StyleProgressBar ...