机器学习——手写数据集的介绍以及案例讲解

系列文章目录

机器学习聚类——DBSCAN(Density-based spatial clustering of applications with noise,基于密度的聚类算法)

机器学习集成学习——Adaboost分离器算法

机器学习聚类算法——BIRCH算法、DBSCAN算法、OPTICS算法

机器学习的一些常见算法介绍【线性回归,岭回归,套索回归,弹性网络】

机器学习集成学习——GBDT(Gradient Boosting Decision Tree 梯度提升决策树)算法

机器学习之SVM分类器介绍——核函数、SVM分类器的使用

机器学习——聚类算法的评分函数_davies_bouldin_score

文章目录

一、MNIST数据集介绍

1.1、解析MNIST数据集中的图片数据

1.2、数据集文件的头

1.3、几种数据文件的说明

1.4、MNIST数据集中的对应关系

二、手写数据集的代码演示

代码部分

总结


前言

本文主要是对手写数据集的介绍以及相关的应用机器学习方面举例。

一、MNIST数据集介绍

MNIST数据集是一个常用的手写数字识别数据集,包含了60000张训练图片和10000张测试图片。每张图片大小为28x28像素,灰度级别为0~255。

MNIST数据集中的图片数据以ubyte格式存储,ubyte是一种无符号字节类型,取值范围在0~255之间。MNIST数据集的图像数据文件为"train-images-idx3-ubyte.gz"和"t10k-images-idx3-ubyte.gz",其中前者存储了训练数据,后者存储了测试数据。这两个文件都可以从MNIST官方网站上下载。

1.1、解析MNIST数据集中的图片数据

解析MNIST数据集中的图片数据可以通过以下步骤完成:

  1. 读取文件头信息:MNIST数据集中的图片数据文件头部包含四个字节的magic number和四个字节的数据集大小信息。magic number用于确定文件类型,数据集大小信息包括数据集中的图片数量和每张图片的大小信息。
  2. 读取图片数据:MNIST数据集中的每个数据都由一个标签(label)和一个图片(image)组成。标签用于表示图片中的数字,图片用28x28的像素矩阵表示。
  3. 将读取的图片数据转换为图像矩阵:MNIST数据集中的每张图片都是由28x28个像素组成的,每个像素的灰度值都在0~255之间。读取图片数据后,需要将它们转换成28x28的矩阵表示。
  • MNIST数据集中的标签数据以ubyte格式存储,标签文件为"train-labels-idx1-ubyte.gz"和"t10k-labels-idx1-ubyte.gz",其中前者存储了训练数据的标签,后者存储了测试数据的标签。每个标签都是一个整数,用于表示相应图片中的数字。
  • MNIST数据集中的标签数据与图片数据一一对应,可以通过标签文件中的位置信息来确定每个图片的标签。
  • MNIST数据集中的图片和标签数据都是按照大端字节序存储的。因此,在读取ubyte格式的数据时,需要注意字节序的问题,避免出现错误。

1.2、数据集文件的头

前四个字节的magic number用于确定文件类型;

后四个字节表示数据集的大小信息,其中前两个字节表示数据集中的图片数量,后两个字节表示每张图片的大小信息。具体来说,对于图像数据文件,后四个字节的前两个字节表示图片数量,后两个字节表示每张图片的大小,也就是28x28=784个字节;对于标签数据文件,后四个字节的前两个字节表示标签数量,后两个字节固定为0。

1.3、几种数据文件的说明

  • t10k-images-idx3-ubyte(第一行):数量为10000的测试图片集,每张图片28*28像素,单通道灰度图;
  • t10k-labels-idx1-ubyte(第二行):数量为10000的测试图像标签集,对应每张测试图像;
  • train-images-idx3-ubyte(第三行):数量为60000的训练图片集,每张图片28*28像素,单通道灰度图;
  • train-labels-idx1-ubyte(第四行):数量为60000的训练图像标签集,对应每张训练图像;
     

1.4、MNIST数据集中的对应关系

由于MNIST数据集将 图片集 和 注释标签 分成了两部分文件分别独立存储,所以弄清楚如何将这两个文件中的信息关联起来至关重要。

总结来说: MNIST数据集中训练集和测试集与其相应的标签集均是一对一的对应关系,即 匹配的文件中对应项目数据组成一组。

比如说: 训练图片集中的第一张图片和训练标签集中的第一个标签就是对应项目,测试图片集中的第五张图片和测试标签集中的第五个标签也为对应项目。

上述 四个文件 共会组成 两套 绑定数据:

  • 一套由 训练图片集+训练集标签 (这两个文件即为匹配文件)组成
  • 一套由 测试图片集+测试集标签 (这两个文件也为匹配文件)组成

二、手写数据集的代码演示

代码部分

# MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST).
# 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生,
# 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.
# 在 MNIST 数据集中的每张图片由 28 x 28 个像素点构成, 每个像素点用一个灰度值表示.
import os
import struct
import numpy as np
#定义加载手写数据集子函数,输入为数据集存储的本地路径和数据集类型(默认为训练集)
def load_mnist(path, kind='train'):
    #生成文件的完整路径
    labels_path = os.path.join(path,'%s-labels-idx1-ubyte'% kind)     #标签文件路径和文件名
    images_path = os.path.join(path,'%s-image-idx3-ubyte'% kind)      #手写数字图形路径和文件名
    #打开标签文件并获取标签数据
    with open(labels_path, 'rb') as lbpath:
        #'>'表示大端字节序;'I’代表无符号整数;
        magic, n = struct.unpack('>II',lbpath.read(8))
        labels = np.fromfile(lbpath,dtype=np.uint8)
    #打开图形文件并获取图形数据
    with open(images_path, 'rb') as imgpath:
        #'>'表示大端字节序;'I’代表无符号整数;
        magic, num, rows, cols = struct.unpack('>IIII',imgpath.read(16))
        #读取数据(为28*28的向量),并把数据展开成1维行向量
        images = np.fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784)
        #把MNIST中的像素值归一化为-1和+1之间的数值
        images = ((images/255.) - .5)*2
    return images, labels
#加载训练集图形数据和标签,训练集数据文件存储路径与代码在同一文件夹下时路径可以为空
#path = 'C:\\ProgramData\\Anaconda3\\Lib\\site-packages\\sklearn\\datasets\\data\\'
path = 'E:\\大三实践课实训集合\\机器学习\\上课练习代码\\'
# path = ' '
#加载原测试集图形数据和标签作为本次实验的训练集数据和标签
from sklearn.model_selection import train_test_split
data = load_mnist(path,kind = 't10k')
X_train,X_test,y_train,y_test = train_test_split(data[0],data[1],test_size = 0.25,random_state = 0)
print('测试集列数:%d,测试集行数:%d'%(X_train.shape[0],X_train.shape[1]))
print('测试集列数:%d,测试集行数:%d'%(X_test.shape[0],X_test.shape[1]))
# path:MNIST数据集所在的路径。
# kind:数据集类型,这里是‘t10k’代表测试集。
# data[0]:代表MNIST数据集中的图像数据。
# data[1]:代表MNIST数据集中的标签数据。
# test_size:代表测试集所占的比例,这里是25%。
# random_state:代表随机数种子,确保每次运行得到的结果相同。
# 最后,代码输出了训练集和测试集的行数和列数。

import matplotlib.pyplot as plt
plt.rcParams['font.sans-serif'] = ['SimHei']
fig,ax = plt.subplots(nrows = 2,ncols = 5,sharex = True,sharey  = True,figsize = (3,1.5))
ax = ax.flatten()
for i in range(10):
    img =  X_train[y_train ==i][0].reshape(28,28)
    ax[i].imshow(img,cmap = 'Greys',interpolation = 'nearest')
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()
fig,ax = plt.subplots(nrows = 5,ncols = 5,sharex = True,sharey  =True,figsize = (2,2))
ax = ax.flatten()
for i in range(25):
    img = X_train[y_train ==3][i].reshape(28,28)
    ax[i].imshow(img,cmap = 'Greys',interpolation = 'nearest')
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()

from sklearn.neural_network import MLPClassifier
mlpc = MLPClassifier(hidden_layer_sizes = (100,),solver = 'sgd',max_iter = 200,learning_rate_init = 0.01,activation = 'tanh')
mlpc.fit(X_train,y_train)
print("最好的损失值:",mlpc.best_loss_)
plt.figure()
plt.xlim([0,len(mlpc.loss_curve_)-1])
plt.plot(mlpc.loss_curve_)
plt.title('训练过程的损失函数值')
plt.xlabel('轮次')
plt.grid(color = 'gray',linewidth = '0.5',linestyle = '--')
plt.show()

# 使用Scikit-learn库中的MLPClassifier类来构建一个多层感知器模型,并使用该模型对MNIST数据集进行训练和测试。其中,MLPClassifier类是一个基于反向传播算法的神经网络模型,可以用于分类和回归问题。代码中的参数解释如下:
# hidden_layer_sizes:代表隐藏层的神经元个数,这里只有一个隐藏层,其中包含100个神经元。
# solver:代表优化算法,这里是随机梯度下降算法(sgd)。
# max_iter:代表训练的最大轮次,这里是200轮。
# learning_rate_init:代表学习率的初始值,这里是0.01。
# activation:代表激活函数,这里是tanh函数。
# 在模型训练完成后,代码输出了模型的最好损失值,并使用Matplotlib库绘制了训练过程中的损失函数值。这可以帮助我们了解模型在训练过程中的性能表现,以及是否存在过拟合或欠拟合等问题。

print("训练数据集准确率:%.2f%%"%(100*mlpc.score(X_train,y_train)))
y_pred = mlpc.predict(X_test)
print("测试数据集准确率:%.2f%%"%(100*mlpc.score(X_train,y_train)))

#输出25个识别错误的图形
miscl_img = X_test[:25]
correct_lab = y_test[:25]
miscl_lab = y_pred[:25]

count = 0
for i in range(np.size(y_pred)):
    if(count==25):
        break
    elif(y_test[i]!=y_pred[i]):
        miscl_img[count] = X_test[i]
        correct_lab[count] = y_test[i]
        miscl_lab[count] = y_pred[i]
        count += 1
    else:
        continue
    
fig,ax = plt.subplots(nrows=5,ncols=5,sharex=True,sharey=True)
ax = ax.flatten()
for i in range(25):
    img = miscl_img[i].reshape(28,28)
    ax[i].imshow(img,cmap='Greys',interpolation='nearest')
    ax[i].set_title('实际:%d 预测:%d'%(correct_lab[i],miscl_lab[i]))
    
ax[0].set_xticks([])    
ax[0].set_yticks([])
plt.tight_layout()
plt.show()

# 对训练后的多层感知器模型进行评估和可视化。
# 首先,使用mlpc.score()方法计算训练集和测试集的准确率,并使用字符串格式化输出结果。
# 然后,使用mlpc.predict()方法对测试集进行预测,将预测结果保存在y_pred中。再次使用mlpc.score()方法计算训练集和测试集的准确率,并使用字符串格式化输出结果。
# 接下来,从测试集中挑选出25个预测错误的样本,并将其的图像、正确标签和错误标签保存在miscl_img、correct_lab和miscl_lab中。这里使用了一个循环来遍历整个测试集,当找到一个预测错误的样本时,将其保存在相应的数组中,并更新计数器count。当count达到25时,退出循环。
# 最后,使用Matplotlib库中的subplot()和imshow()方法将这25个样本的图像以5行5列的方式绘制在一个图像中,并在每个子图像标题中显示其正确标签和错误标签。

代码运行结果

测试集列数:7500,测试集行数:784
测试集列数:2500,测试集行数:784

最好的损失值: 0.007473377636954111

训练数据集准确率:100.00%
测试数据集准确率:100.00%

上述代码里面的数据集手写数据集的10000个测试集数据

总结

以上就是今天的内容~

最后欢迎大家点赞👍,收藏⭐,转发🚀,
如有问题、建议,请您在评论区留言💬哦。

  • 0
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

张小鱼༒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值