技术标签: Mnist数据集
详见 http://blog.csdn.net/simple_the_best/article/details/75267863
MNIST 数据集已经是一个被”嚼烂”了的数据集, 很多教程都会对它”下手”, 几乎成为一个 “典范”. 不过有些人可能对它还不是很了解, 下面来介绍一下.
MNIST 数据集可在 http://yann.lecun.com/exdb/mnist/ 获取, 它包含了四个部分:
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 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
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 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()
我们现在应该可以看到一个 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 的文件格式将会占用更多的磁盘空间, 如下所示:
如果我们打算保存这些 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.
文章浏览阅读3.6k次。还有一种热点数据的发现机制,那就是实时的做收集,比如在客户端、服务端或者在代理层,都可以对实时数据进行采集,然后进行统计汇总。达到一定的数量之后,就会被识别为热key如何解决热key问题解决热key问题最主要的方式就是加缓存。通过缓存的方式尽量减少系统交互,使得用户请求可以提前返回。这样即能提升用户体验,也能减少系统压力。缓存的方式有很多,有些数据可以缓存在客户的客户端浏览器中,有些数据可以缓存在距离用户就近的DNS中,有些数据可以通过Redis等这类缓存框架进行缓存,还有些数据可以通过服务器本地_jd-hotkey
文章浏览阅读2k次。SAE J1708协议1.协议简介1708是SAE(Society of Automotive Engineers:美国机动车工程师学会)专门针对重型车辆(卡车和客车)起草文件中J标准规范之一,该协议旨在推广微控制器模块之间的通信标准规范。SAE J1708协议仅详细描述了OSI(Open System Interconnection:开放式系统互联)七层模型中的物理层和数据链路层。所以在进行通信时,常常需要与描述应用层的SAE J1587协议一起使用。图1-OSI模型 ..._j1708协议
文章浏览阅读7.2k次,点赞8次,收藏53次。上一篇介绍了CNN基本概念和卷积的知识,CNN的特征抽取除了包含卷积,还包含池化。池化池化又叫子采样,是特殊的卷积。池化比较好理解,还是上篇公司工作交接的例子,每个销售区域有100个老员工,我们可以先推举一个最懂本区域的业务人员参与交接(如各区域的领导),其他人员不必参与交接;或者每个区域内部先开一个会,把100个老员工的经验结合在一起,生成一个会议纪要,根据这份纪要与新员工交接。这实际对应两种池...
文章浏览阅读92次。java很火,日志记录又是必需,因此就有了大量的日志记录框架,在日常使用时因为日志框架冲突引发各种问题,本文对之进行梳理,适合入门。由于作者水平限制,本文可能不够清晰甚至有错,烦请指出。在文章末尾的参考部分,有几位大牛总结的文章,推荐给大家。下文将着重介绍上述日志框架的区别,以及避免不同框架组合引入时的冲突。两个概念日志系统日志接口的具体实现。经典的有log4j,jdk自带的有java.u...
文章浏览阅读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次。现在美国是产业互联网强而消费互联网弱,而中国刚好反过来,消费互联网强而产业互联网弱,所以产业升级空间巨大,人工智能的产业应用阶段到来。
文章浏览阅读2.7k次,点赞3次,收藏11次。CMake编译指定OpenCV版本、pcl版本_cmake中手动设置pcl位置
文章浏览阅读5.9k次,点赞2次,收藏3次。有时候编写Oracle中用游标等信息去循环处理逻辑的时候,对EXIT、RETURN、CONTINUE很容易搞混淆,网上搜了资料也不是很清楚,所以本人自己写了一小段代码测试了这三种用法。案例代码如下:12345678910111213141516_oracle存储过程if条件退出程序
文章浏览阅读9.2k次,点赞5次,收藏25次。此文章是做一个小例子,在Qt5环境下,通过vlc将桌面共享出去,也就是将桌面推流Qt5如何使用vlc在这里就不讲了,可以看博客直接上代码: libvlc_instance_t *vlc; const char *sout = "#transcode{vcodec=h264,fps=25,venc=x264{preset=ultrafast,"\
文章浏览阅读314次。LT8711UXE2 是一款高性能 C/DP1.4 型至 HDMI2.0 转换器_lt8711uxe
文章浏览阅读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数据
文章浏览阅读1.2k次。 在上一篇中作者给大家详细介绍了 ASP 内建对象 Response 的使用方法,在这一篇中作者将继续给大家介绍另两个非常实用且重要的 ASP 的内建对象 Application 和 Session。 在 ASP 的内建对象中除了用于发送、接收和处理数据的对象外,还有一些非常实用的代表 Active Server 应用程序和单个用户信息的对象。 让我们先来看看 Application 对