如何解决knn 图像分类,精度差
我有一个用于图像分类的 knn 算法。在 trainImages 中我有用于训练的图像,在 trainLabels 中它们的标签、validationImages 和 validationLabels 用于测试
import imageio
import glob
import numpy as np
import os
import csv
trainImages = []
for imagePath in glob.glob('C:/Users/razva/*.png'):
image = imageio.imread(imagePath)
trainImages.append(image)
trainImages = np.array(trainImages)
trainImages = trainImages[:,0]
f = open('C:/Users/razva/train.txt')
trainLabels = f.readlines()
for i in range(len(trainLabels)):
trainLabels[i] = int(trainLabels[i][11])
trainLabels = np.array(trainLabels)
validationImages = []
for imagePath in glob.glob('C:/Users/razva/*.png'):
image = imageio.imread(imagePath)
validationImages.append(image)
validationImages = np.array(validationImages)
f = open('C:/Users/razva/validation.txt')
validationLabels = f.readlines()
for i in range(len(validationLabels)):
validationLabels[i] = int(validationLabels[i][11])
validationLabels = np.array(validationLabels)
validationImages = validationImages[:,0]
class ImageIdentifier:
def __init__(self,trainImages,trainLabels):
self.trainImages = trainImages
self.trainLabels = trainLabels
def classify(self,testImage,bins = 5):
distances = np.sum(np.abs(trainImages - testImage),axis = -1)
index = np.argsort(distances)
neighbors = self.trainLabels[index[:bins]]
x = np.bincount(neighbors)
return np.argmax(x)
p = ImageIdentifier(trainImages,trainLabels)
with open('output.csv','w') as file:
writer = csv.writer(file)
writer.writerow(['id','label'])
nr = 0
for i in range(len(validationLabels)):
writer.writerow([i,p.classify(validationImages[i])])
if validationLabels[i] == p.classify(validationImages[i]):
nr += 1
print(nr / 5000)
我只得到了 17%。我做错了什么?我尝试对训练数据进行归一化,但准确率并未提高。
解决方法
KNN 没有详细说明特定类的属性。它只是发现(可以说)每个像素值的差异,而不是特征。 KNN 在以列作为属性的数据(表格数据)上效果更好,其中每个属性都定义了一个特定的特征。但在图像情况下,每个像素值都没有定义特定的特征。就像人的鼻子会位于不同图像中的不同像素位置。您应该使用深度学习以获得更好的结果(特别是 CNN)。
我很抱歉我的英语不好。我希望我已经传达了信息。
快乐学习!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。