计算机视觉标准数据集整理—MNIST数据集

MNIST手写体数字集


此数据集包含了60000张28x28的二值(手写数字)训练图像;10000张28x28的二值(手写数字)测试图像;


主要用作分类任务,可以分成0-9这10个类别。





数字集下载



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文件解压后,发现这些文件并不是标准的图像格式,而是以字节的形式都保存在二进制文件中,每个样本图像的宽高为28*28。我们需要把它们读取到 NumPy array 中, 以便训练和测试算法。


mnist的结构如下,选取train-images:




  • 首先,该数据是以二进制存储的,我们读取的时候要以’rb’方式读取;

  • 其次,真正的数据只有[value]这一项,其他的[type]等只是来描述的,并不真正在数据文件里面;

  • 也就是说,在读取真实数据之前,我们要读取4个32 bit integer。由[offset]我们可以看出真正的pixel是从0016开始的,一个int32位,所以在读取pixel之前我们要读取4个 32 bit integer,也就是magic number, number ofimages, number of rows, number of columns。当然,在这里使用struct.unpack_from()会比较方便;


     

  

load_mnis函数返回两个数组,第一个是一个 n x m 维的NumPyarray(images),这里的 n 是样本数(行数),m 是特征数(列数);


 训练数据集包含 60,000个样本, 测试数据集包含10,000 样本。在 MNIST 数据集中的每张图片由 28 x 28个像素点构成, 每个像素点用一个灰度值表示。


在这里, 我们将 28 x 28 的像素展开为一个一维的行向量, 这些行向量就是图片数组里的行(每行784 个值, 或者说每行就是代表了一张图片)。


load_mnis函数返回的第二个数组(labels) 包含了相应的目标变量, 也就是手写数字的类标签(整数 0-9)。


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



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




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


  • >: 这是指大端(用来定义字节是如何存储的); 如果你还不知道什么是大端和小端, Endianness 是一个非常好的解释;

  • I: 这是指一个无符号整数。


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


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


 


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




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




执行上面的代码后, 我们应该看到数字 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 以后, 我们应该执行下列代码:




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




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






评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值