应用SVM对MNIST数据集进行分类

MNIST是机器学习领域十分经典的一个手写数字数据集,共60000张训练图像,10000张测试图像,图像大小为28*28.

MNIST百度网盘下载地址:https://pan.baidu.com/s/1k1Ji6amaUhDG6jfdcl_kNg  提取码:nykv

将下载下来的压缩包解压后放到源代码所在的文件夹下即可。

如运行缺少相关python库,可往https://www.lfd.uci.edu/~gohlke/pythonlibs/下载

SVM分类MNIST的源代码如下:

from sklearn import svm
import numpy as np
from time import time
from sklearn.metrics import accuracy_score
from struct import unpack
from sklearn.model_selection import GridSearchCV

def readimage(path):
    with open(path, 'rb') as f:
        magic, num, rows, cols = unpack('>4I', f.read(16))
        img = np.fromfile(f, dtype=np.uint8).reshape(num, 784)
    return img

def readlabel(path):
    with open(path, 'rb') as f:
        magic, num = unpack('>2I', f.read(8))
        lab = np.fromfile(f, dtype=np.uint8)
    return lab

def main():
    train_data  = readimage("train-images.idx3-ubyte")
    train_label = readlabel("train-labels.idx1-ubyte")
    test_data   = readimage("t10k-images.idx3-ubyte")
    test_label  = readlabel("t10k-labels.idx1-ubyte")
    svc=svm.SVC()
    parameters = {'kernel':['rbf'], 'C':[1]}
    print("Train...")
    clf=GridSearchCV(svc,parameters,n_jobs=-1)
    start = time()
    clf.fit(train_data, train_label)
    end = time()
    t = end - start
    print('Train:%dmin%.3fsec' % (t//60, t - 60 * (t//60)))
    prediction = clf.predict(test_data)
    print("accuracy: ", accuracy_score(prediction, test_label))
    accurate=[0]*10
    sumall=[0]*10
    i=0
    while i<len(test_label):
        sumall[test_label[i]]+=1
        if prediction[i]==test_label[i]:
            accurate[test_label[i]]+=1
        i+=1
    print("分类正确的:",accurate)
    print("总的测试标签:",sumall)

if __name__ == '__main__':
    main()

程序通过readimage和readlabel函数读入数据后创建svm分类器,并用parameter添加相应的参数,这里使用GridSearchCV将参数作为输入优化网络,这里输入的parameter对应分类器唯一,可进行添加以达到优化参数的目的,代码中使用GridSearchCV的主要目的是引入n_jobs让cpu进行多线程处理,n_jobs=-1时程序的并行数将和cpu的核数一致,从而极大的加速程序的运行。在i5-8300H的四核CPU中训练时间为26min。

源代码训练时的正确率如下:

欢迎评论区交流。

友情链接:svm.SVC参数详解:https://blog.csdn.net/weixin_41990278/article/details/93137009

                  GridSearchCV参数详解:https://blog.csdn.net/foneone/article/details/89985045

  • 9
    点赞
  • 79
    收藏
    觉得还不错? 一键收藏
  • 10
    评论
【资源说明】 该项目是个人毕设项目源码,评审分达到95分,都经过严格调试,确保可以运行!放心下载使用。 该项目资源主要针对计算机、自动化等相关专业的学生或从业者下载使用,也可作为期末课程设计、课程大作业、毕业设计等。 具有较高的学习借鉴价值!基础能力强的可以在此基础上修改调整,以实现类似其他功能。 本次遥感图像识别算法采用的数据集是武汉大学提供的WHU-RS19数据集,该数据集包含了机场,海滩,桥,商业区,沙漠,农田,足球场,森林,工业区,草地,山,公园,停车场, 池塘, 港口, 火车站, 住宅区, 河流和高架桥总共19类遥感图像。图像的分辨率大都为600×600,每一个种类大约有50张图像。 数据集的预处理与索引文档的生成 在原始的数据集中,有4张分辨率不是600×600的图像已被去除。 利用 split_dataset.py 将数据集按照 0.8: 0.2 的比例分为训练集和测试集,分别置于train文件夹和test文件夹中。 利用 generate_txt.py 分别生成训练集和测试集的索引文件,索引文件中包括了图片的路径和图片的标签(0~19)。由于后面的实验在Google Colab上进行,因此我手动统一修改了图片的路径。最后得到的索引文件分别为train.txt和test.txt ## kNN kNN(k-邻近算法)是最为简单的机器学习算法。在kNN算法中,一个对象的分类是由其邻居的“多数表决”确定的,k个最近邻居(k为正整数,通常较小)中最常见的分类决定了赋予该对象的类别。若k = 1,则该对象的类别直接由最近的一个节点赋予。 ### kNN的测试效果 kNN作为一种最简单的机器学习算法,我并未对其的测试效果报以太大的期望。在本次测试中,我先将k取为1,测试这种最简单的模式下的效果,最终其测试的准确率为16%。 ### 分析参数k对kNN的测试效果的影响 采用kNN算法需要重点关注的是k值的选取。一般情况下,在分类时较大的K值能够减小噪声的影响,但会使类别之间的界限变得模糊。因此本实验分别尝试了k = 1,3,5,10,15下kNN算法的测试精度。 SVM机器学习中,SVM是一种常用的监督学习算法,其目的在于寻找一个超平面,能够以最大间隔将各类数据分开。作为传统的机器学习算法中表现非常优秀的一种算法,SVM在许多场景中都得到了应用。 CNN 卷积神经网络是目前图像识别中最为流行的机器学习算法,本实验的目的在于了解CNN在WHU-RS19数据集上的表现效果,并观察网络结构的变化对训练结果的影响。 LSTM 递归神经网络在语音识别、图像识别中得到了广泛的应用。在之前的期中作业中,我采用了RNN、LSTM和GRU等递归神经网络在MNIST、FashionMNIST、CIFAR10等比较简单的数据集进行了测试。本实验中使用的WHU-RS19数据集的识别难度明显大于以上提及的几个数据集,通过该实验,我们也可以横向对比LSTM与其他机器学习算法的性能差异。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值