转自:https://blog.csdn.net/simple_the_best/article/details/75267863

MNIST 数据集已经是一个被”嚼烂”了的数据集, 很多教程都会对它”下手”, 几乎成为一个 “典范”. 不过有些人可能对它还不是很了解, 下面来介绍一下.

MNIST 数据集可在 http://yann.lecun.com/exdb/mnist/ 获取, 它包含了四个部分:

  • Training set images: train-images-idx3-ubyte.gz (9.9 MB, 解压后 47 MB, 包含 60,000 个样本)
  • Training set labels: train-labels-idx1-ubyte.gz (29 KB, 解压后 60 KB, 包含 60,000 个标签)
  • Test set images: t10k-images-idx3-ubyte.gz (1.6 MB, 解压后 7.8 MB, 包含 10,000 个样本)
  • Test set labels: t10k-labels-idx1-ubyte.gz (5KB, 解压后 10 KB, 包含 10,000 个标签)

MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.

不妨新建一个文件夹 – mnist, 将数据集下载到 mnist 以后, 解压即可:

图片是以字节的形式进行存储, 我们需要把它们读取到 NumPy array 中, 以便训练和测试算法.

import os
import struct
import numpy as npdef load_mnist(path, kind='train'):"""Load MNIST data from `path`"""labels_path = os.path.join(path,'%s-labels-idx1-ubyte'% kind)images_path = os.path.join(path,'%s-images-idx3-ubyte'% kind)with open(labels_path, 'rb') as lbpath:magic, n = struct.unpack('>II',lbpath.read(8))labels = np.fromfile(lbpath,dtype=np.uint8)with open(images_path, 'rb') as imgpath:magic, num, rows, cols = struct.unpack('>IIII',imgpath.read(16))images = np.fromfile(imgpath,dtype=np.uint8).reshape(len(labels), 784)return images, labels

load_mnist 函数返回两个数组, 第一个是一个 n x m 维的 NumPy array(images), 这里的 n 是样本数(行数), m 是特征数(列数). 训练数据集包含 60,000 个样本, 测试数据集包含 10,000 样本. 在 MNIST 数据集中的每张图片由 28 x 28 个像素点构成, 每个像素点用一个灰度值表示. 在这里, 我们将 28 x 28 的像素展开为一个一维的行向量, 这些行向量就是图片数组里的行(每行 784 个值, 或者说每行就是代表了一张图片). load_mnist 函数返回的第二个数组(labels) 包含了相应的目标变量, 也就是手写数字的类标签(整数 0-9).

第一次见的话, 可能会觉得我们读取图片的方式有点奇怪:

magic, n = struct.unpack('>II', lbpath.read(8))
labels = np.fromfile(lbpath, dtype=np.uint8)

为了理解这两行代码, 我们先来看一下 MNIST 网站上对数据集的介绍:

TRAINING SET LABEL FILE (train-labels-idx1-ubyte):[offset] [type]          [value]          [description]
0000     32 bit integer  0x00000801(2049) magic number (MSB first)
0004     32 bit integer  60000            number of items
0008     unsigned byte   ??               label
0009     unsigned byte   ??               label
........
xxxx     unsigned byte   ??               label
The labels values are 0 to 9.

通过使用上面两行代码, 我们首先读入 magic number, 它是一个文件协议的描述, 也是在我们调用 fromfile 方法将字节读入 NumPy array 之前在文件缓冲中的 item 数(n). 作为参数值传入 struct.unpack 的 >II 有两个部分:

  • >: 这是指大端(用来定义字节是如何存储的); 如果你还不知道什么是大端和小端, Endianness 是一个非常好的解释. (关于大小端, 更多内容可见<<深入理解计算机系统 – 2.1 节信息存储>>)
  • I: 这是指一个无符号整数.

通过执行下面的代码, 我们将会从刚刚解压 MNIST 数据集后的 mnist 目录下加载 60,000 个训练样本和 10,000 个测试样本.

为了了解 MNIST 中的图片看起来到底是个啥, 让我们来对它们进行可视化处理. 从 feature matrix 中将 784-像素值 的向量 reshape 为之前的 28*28 的形状, 然后通过 matplotlib 的 imshow 函数进行绘制:

import matplotlib.pyplot as pltfig, ax = plt.subplots(nrows=2,ncols=5,sharex=True,sharey=True, )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()

我们现在应该可以看到一个 2*5 的图片, 里面分别是 0-9 单个数字的图片.

此外, 我们还可以绘制某一数字的多个样本图片, 来看一下这些手写样本到底有多不同:

fig, ax = plt.subplots(nrows=5,ncols=5,sharex=True,sharey=True, )ax = ax.flatten()
for i in range(25):img = X_train[y_train == 7][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()

执行上面的代码后, 我们应该看到数字 7 的 25 个不同形态:

另外, 我们也可以选择将 MNIST 图片数据和标签保存为 CSV 文件, 这样就可以在不支持特殊的字节格式的程序中打开数据集. 但是, 有一点要说明, CSV 的文件格式将会占用更多的磁盘空间, 如下所示:

  • train_img.csv: 109.5 MB
  • train_labels.csv: 120 KB
  • test_img.csv: 18.3 MB
  • test_labels: 20 KB

如果我们打算保存这些 CSV 文件, 在将 MNIST 数据集加载入 NumPy array 以后, 我们应该执行下列代码:

np.savetxt('train_img.csv', X_train,fmt='%i', delimiter=',')
np.savetxt('train_labels.csv', y_train,fmt='%i', delimiter=',')
np.savetxt('test_img.csv', X_test,fmt='%i', delimiter=',')
np.savetxt('test_labels.csv', y_test,fmt='%i', delimiter=',')

一旦将数据集保存为 CSV 文件, 我们也可以用 NumPy 的 genfromtxt 函数重新将它们加载入程序中:

X_train = np.genfromtxt('train_img.csv',dtype=int, delimiter=',')
y_train = np.genfromtxt('train_labels.csv',dtype=int, delimiter=',')
X_test = np.genfromtxt('test_img.csv',dtype=int, delimiter=',')
y_test = np.genfromtxt('test_labels.csv',dtype=int, delimiter=',')

不过, 从 CSV 文件中加载 MNIST 数据将会显著发给更长的时间, 因此如果可能的话, 还是建议你维持数据集原有的字节格式.

参考: 
- Book , Python Machine Learning.

MNIST 数据集简介相关推荐

  1. MNIST数据集简介与使用

    MNIST数据集简介   MNIST数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST).训练集(train ...

  2. Mnist数据集简介

    1,基本概念 MNIST是一个非常有名的手写体数字识别数据集,在很多资料中,这个数据集都会被用作深度学习的入门样例.而TensorFlow的封装让使用MNIST数据集变得更加方便.MNIST数据集是N ...

  3. Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集简介、下载、使用方法(包括数据增强)之详细攻略

    Dataset之MNIST:MNIST(手写数字图片识别+ubyte.gz文件)数据集简介+数据增强(将已有MNIST数据集通过移动像素上下左右的方法来扩大数据集为初始数据集的5倍) 目录 MNIST ...

  4. mnist数据集读取并保存为Numpy数组

    背景信息 MNIST数据集简介 MNIST数据集是从 NIST 的Special Database 3(SD-3)和Special Database 1(SD-1)构建而来.由于SD-3是由美国人口调 ...

  5. 机器学习之sklearn使用下载MNIST数据集进行分类识别

    机器学习之sklearn使用下载MNIST数据集进行分类识别 一.MNIST数据集 1.MNIST数据集简介 2.获取MNIST数据集 二.训练一个二分类器 1.随机梯度下降(SGD)分类器 2.分类 ...

  6. 全面理解主成分分析(PCA)和MNIST数据集的Python降维实现

    注:本博文为原创博文,如需转载请注明原创链接!!!   这篇博文主要讲述主成分分析的原理并用该方法来实现MNIST数据集的降维. 一.引言   主成分分析是一种降维和主成分解释的方法.举一个比较容易理 ...

  7. caffe(ubuntu14.04)学习笔记1——运行MNIST数据集模型

    MNIST数据集简介: MNIST数据集是一个大型的手写体数据库,广泛用于机器学习领域的训练和测试,它是由纽约大学的Yann LeCun教授整理的,包括60000个训练样本和10000个测试样本,其图 ...

  8. MNIST数据集的导入与预处理

    在做KNN+LDA对MNIST数据集分类时遇到了不少坑,本篇文章主要是记录一下解决这些坑的方案,完整的代码和实验报告等作业结束提交后再进行上传. MNIST数据集 MNIST数据集简介 MNIST数据 ...

  9. MNIST数据集提取图片和标注信息

    MNIST数据集 简介 MNIST数据集(http://yann.lecun.com/exdb/mnist/)是著名的手写数字分类数据集,主要由一下四部分组成: 训练集图片:train-images. ...

最新文章

  1. C++读写txt文件方式以及基于opencv的Mat数据类型读写txt文件
  2. poj 1873 枚举+凸包
  3. 在linux系统中 用于配置和显示,在Linux系统中使用sway设置多个显示器/监视器
  4. if 需求:小于或等于18未成年,小于或等于30青年人,其余都是老年人
  5. 在linux下安装mongo数据库,Linux系统下安装MongoDB
  6. Pentium 4处理器架构/微架构/流水线(1) - 概述
  7. android 分享qq微信朋友圈,H5微信JS-SDK实现分享朋友 朋友圈以及QQ自定义分享
  8. Mac下虚拟机使用那些事儿
  9. Qt第六课 QDateTime使用
  10. 数论和有限域的基本概念
  11. cesium鼠标控制键盘_Package - cesium-plotting-symbol
  12. java在线运行工具,终于搞明白了
  13. 透明、反光材质护肤品拍摄技巧
  14. 力扣(300,674)补9.11
  15. html动态网页添加音频_将音频添加到网页
  16. 思维导图软件 XMind 8 和 XMind 2020的选择
  17. Android 11 Bata 正式发布!闲鱼最新升级版 Flutter 技术电子书开放下载
  18. Unity 最近经验分享
  19. linux查看tomcat 控制台,linux 下查看Tomcat的状态,以及开启停止服务命令
  20. 8种开源的ETL工具

热门文章

  1. ThinkPHP 6.0 phpspreadsheet操作Excel表格实例
  2. ISO20000认证材料大全
  3. 在职和辞职,哪个状态找工作比较好?
  4. Java文本文件切割
  5. PCM、FLTP、S16资料了解
  6. 面向对象思想(详解)
  7. 小本生意做什么好赚钱又快,看看这5个小生意,赚钱快!
  8. 搭建胜过Apache十倍的Web服务器
  9. 【历史上的今天】4 月 21 日:微处理器先驱诞生;Winamp 发布;COPPA 正式生效
  10. 下界和下确界的关系_微分基本定理与上确界