详解 MNIST 数据集_mnist数据集-程序员宅基地

技术标签: Mnist数据集  

详见 http://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 以后, 解压即可:

dataset

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

import os
import struct
import numpy as np

def 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
  
  
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25

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)
  
  
   
  • 1
  • 2

为了理解这两行代码, 我们先来看一下 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.
  
  
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10

通过使用上面两行代码, 我们首先读入 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 plt

fig, 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()
  
  
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

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

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()
  
  
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

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

7

另外, 我们也可以选择将 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=',')
  
  
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

一旦将数据集保存为 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=',')
  
  
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8

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

参考:
- Book , Python Machine Learning.


版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/ibelieveican2015/article/details/79010049

智能推荐

京东热-key-探测框架新版发布,单机-QPS-可达-35-万_jd-hotkey_AK774S的博客-程序员宅基地

文章浏览阅读3.6k次。还有一种热点数据的发现机制,那就是实时的做收集,比如在客户端、服务端或者在代理层,都可以对实时数据进行采集,然后进行统计汇总。达到一定的数量之后,就会被识别为热key如何解决热key问题解决热key问题最主要的方式就是加缓存。通过缓存的方式尽量减少系统交互,使得用户请求可以提前返回。这样即能提升用户体验,也能减少系统压力。缓存的方式有很多,有些数据可以缓存在客户的客户端浏览器中,有些数据可以缓存在距离用户就近的DNS中,有些数据可以通过Redis等这类缓存框架进行缓存,还有些数据可以通过服务器本地_jd-hotkey

SAE J1708协议-程序员宅基地

文章浏览阅读2k次。SAE J1708协议1.协议简介1708是SAE(Society of Automotive Engineers:美国机动车工程师学会)专门针对重型车辆(卡车和客车)起草文件中J标准规范之一,该协议旨在推广微控制器模块之间的通信标准规范。SAE J1708协议仅详细描述了OSI(Open System Interconnection:开放式系统互联)七层模型中的物理层和数据链路层。所以在进行通信时,常常需要与描述应用层的SAE J1587协议一起使用。图1-OSI模型 ..._j1708协议

卷积神经网络CNN(二)池化、结构、误差反向传播-程序员宅基地

文章浏览阅读7.2k次,点赞8次,收藏53次。上一篇介绍了CNN基本概念和卷积的知识,CNN的特征抽取除了包含卷积,还包含池化。池化池化又叫子采样,是特殊的卷积。池化比较好理解,还是上篇公司工作交接的例子,每个销售区域有100个老员工,我们可以先推举一个最懂本区域的业务人员参与交接(如各区域的领导),其他人员不必参与交接;或者每个区域内部先开一个会,把100个老员工的经验结合在一起,生成一个会议纪要,根据这份纪要与新员工交接。这实际对应两种池...

Java日志框架-程序员宅基地

文章浏览阅读92次。java很火,日志记录又是必需,因此就有了大量的日志记录框架,在日常使用时因为日志框架冲突引发各种问题,本文对之进行梳理,适合入门。由于作者水平限制,本文可能不够清晰甚至有错,烦请指出。在文章末尾的参考部分,有几位大牛总结的文章,推荐给大家。下文将着重介绍上述日志框架的区别,以及避免不同框架组合引入时的冲突。两个概念日志系统日志接口的具体实现。经典的有log4j,jdk自带的有java.u...

CS5266 CS8.1 TYPEC转HDMI+PD+U3+RJ45+SD多功能扩展坞方案 CS5266搭配CS8.1方案-程序员宅基地

文章浏览阅读75次。CS5363 2lane DP to HDMI 4k@60HzCS5366 2lane USB-C to HDMI 4k@30Hz + charging (+USB3.0)CS5466 8K30HZ(4K144)by 2laneCS5801AN HDMI TO eDP/DPCS5516AN MIPI/DSI TO LVDSCS5518AN MIPI/DSI TO 双路LVDSCS5262AN DP to HDMI 4k@60Hz + VGACS5263AN DP to HDMI 4k@60Hz

中国新四大发明背后的“数据智能”-程序员宅基地

文章浏览阅读1.5k次。现在美国是产业互联网强而消费互联网弱,而中国刚好反过来,消费互联网强而产业互联网弱,所以产业升级空间巨大,人工智能的产业应用阶段到来。

随便推点

CMake编译指定OpenCV版本、pcl版本_cmake中手动设置pcl位置_wongHome的博客-程序员宅基地

文章浏览阅读2.7k次,点赞3次,收藏11次。CMake编译指定OpenCV版本、pcl版本_cmake中手动设置pcl位置

oracle存储过程跳出循环问题_oracle存储过程if条件退出程序-程序员宅基地

文章浏览阅读5.9k次,点赞2次,收藏3次。有时候编写Oracle中用游标等信息去循环处理逻辑的时候,对EXIT、RETURN、CONTINUE很容易搞混淆,网上搜了资料也不是很清楚,所以本人自己写了一小段代码测试了这三种用法。案例代码如下:12345678910111213141516_oracle存储过程if条件退出程序

Qt开发: Qt5使用VLC库推流-- 共享桌面-程序员宅基地

文章浏览阅读9.2k次,点赞5次,收藏25次。此文章是做一个小例子,在Qt5环境下,通过vlc将桌面共享出去,也就是将桌面推流Qt5如何使用vlc在这里就不讲了,可以看博客直接上代码: libvlc_instance_t *vlc; const char *sout = "#transcode{vcodec=h264,fps=25,venc=x264{preset=ultrafast,"\

龙迅LT8711UXE2 是一款高性能 C/DP1.4 型至 HDMI2.0 转换器_hw13554961857的博客-程序员宅基地

文章浏览阅读314次。LT8711UXE2 是一款高性能 C/DP1.4 型至 HDMI2.0 转换器_lt8711uxe

POI导入导出Excel数据(IDEA版)简单运用_poi导入excel数据_zhaoguoqing_1999的博客-程序员宅基地

文章浏览阅读8.2k次,点赞17次,收藏86次。一、POIApache POI是Apache软件基金会的开放源码函式库,POI提供API给Java程序对Microsoft Office格式档案读和写的功能,简单来说就是能在Java程序中导入导出Word,Excel,PPT,Visio等文件内容。二、使用POI运行环境:IDEA 2019.3.3 x64JDK 1.8.0_241Maven 3.6.3我将以Excel表格的导入导出为例,演示如何使用POI。1.创建Maven项目新建Maven项目,通过模板创建可以更快捷。配置电脑中_poi导入excel数据

9.第九篇 ASP内建对象Application 和 Session -程序员宅基地

文章浏览阅读1.2k次。 在上一篇中作者给大家详细介绍了 ASP 内建对象 Response 的使用方法,在这一篇中作者将继续给大家介绍另两个非常实用且重要的 ASP 的内建对象 Application 和 Session。    在 ASP 的内建对象中除了用于发送、接收和处理数据的对象外,还有一些非常实用的代表 Active Server 应用程序和单个用户信息的对象。   让我们先来看看 Application 对