深度学习之MNIST数据集识别(四)
MNIST
MNIST 数据集来自美国国家标准与技术研究所, National Institute of Standards and Technology (NIST). 训练集 (training set) 由来自 250 个不同人手写的数字构成, 其中 50% 是高中学生, 50% 来自人口普查局 (the Census Bureau) 的工作人员. 测试集(test set) 也是同样比例的手写数字数据.
MNIST数据库的文件格式
数据以非常简单的文件格式存储,用于存储矢量和多维矩阵。
文件中的所有整数都以大多数非英特尔处理器使用的MSB优先(高端)格式存储。英特尔处理器和其他低端机器的用户必须翻转标头的字节。
有4个文件:
train-images-idx3-ubyte:training set images
train-labels-idx1-ubyte:training set labels
t10k-images-idx3-ubyte:test set images
t10k-labels-idx1-ubyte:test set labels
训练集包含60000个示例,测试集包含10000个示例。
测试集的前5000个示例取自原始NIST训练集。最后的5000个来自原始的NIST测试集。第一个5000比过去5000更干净,更容易。
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.
TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 60000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).
TEST SET LABEL FILE (t10k-labels-idx1-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000801(2049) magic number (MSB first)
0004 32 bit integer 10000 number of items
0008 unsigned byte ?? label
0009 unsigned byte ?? label
........
xxxx unsigned byte ?? label
The labels values are 0 to 9.
TEST SET IMAGE FILE (t10k-images-idx3-ubyte):
[offset] [type] [value] [description]
0000 32 bit integer 0x00000803(2051) magic number
0004 32 bit integer 10000 number of images
0008 32 bit integer 28 number of rows
0012 32 bit integer 28 number of columns
0016 unsigned byte ?? pixel
0017 unsigned byte ?? pixel
........
xxxx unsigned byte ?? pixel
Pixels are organized row-wise. Pixel values are 0 to 255. 0 means background (white), 255 means foreground (black).
所以对于训练集(train-images-idx3-ubyte:training set images )数据的偏移量从offset 0016开始。而标签集(train-labels-idx1-ubyte)数据的偏移量是从offset 0008开始的。
将读取的数据转化成数字保存到列表中,然后使用matplotlib输出一下效果。
代码
#!/usr/bin/env python
# -*- coding: UTF-8 -*-
import struct
from bp import *
from datetime import datetime
import matplotlib.pyplot as plt
# 数据加载器基类
class Loader(object):
def __init__(self, path, count):
'''
初始化加载器
path: 数据文件路径
count: 文件中的样本个数
'''
self.path = path
self.count = count
def get_file_content(self):
'''
读取文件内容
'''
f = open(self.path, 'rb')
content = f.read()
f.close()
return content
def to_int(self, byte):
'''
将unsigned byte字符转换为整数
'''
return struct.unpack('B', byte)[0]
# 图像数据加载器
class ImageLoader(Loader):
def get_picture(self, content, index):
'''
内部函数,从文件中获取图像
'''
##从偏移量位置开始读取有效数据
start = index * 28 * 28 + 16
picture = []
for i in range(28):
picture.append([])
for j in range(28):
picture[i].append(
self.to_int(content[start + i * 28 + j]))
#picture 结构 二位数组 28*28
return picture
def load_image(self):
'''
加载数据文件,获得全部样本的输入向量
'''
#读取所有的图片样本
content = self.get_file_content()
data_set = []
for index in range(self.count):
data_one = [];
data_one = self.get_picture(content, index);
data_set.append(data_one);
#data_set 格式 [[图1][图2]] 图1=[[][][]]=28*28
return data_set
# 标签数据加载器
class LabelLoader(Loader):
def load(self):
'''
加载数据文件,获得全部样本的标签向量
'''
content = self.get_file_content()
labels = []
for index in range(self.count):
labels.append(self.to_int(content[index + 8]));
return labels
def get_training_image():
'''
获得训练数据集
'''
image_loader = ImageLoader('train-images.idx3-ubyte', 1000)
label_loader = LabelLoader('train-labels.idx1-ubyte', 1000)
return image_loader.load_image(), label_loader.load()
if __name__ == '__main__':
#获取图片和标识集
x_train,y_train = get_training_image();
#构建子图
fig, ax = plt.subplots(nrows=2,ncols=5,sharex=True,sharey=True,);
ax = ax.flatten();
for index in range(10):
for j in range(len(y_train)):
if y_train[j] == index:
img = x_train[j];
ax[index].imshow(img, cmap='Greys', interpolation='nearest');
break;
ax[0].set_xticks([])
ax[0].set_yticks([])
plt.tight_layout()
plt.show()
执行结果
参考
零基础入门深度学习(3) - 神经网络和反向传播算法
https://www.zybuluo.com/hanbingtao/note/476663
详解 MNIST 数据集
https://blog.csdn.net/simple_the_best/article/details/75267863