美文网首页
mnist数据集介绍

mnist数据集介绍

作者: 我要当大佬 | 来源:发表于2017-10-18 22:28 被阅读0次

转载:http://blog.csdn.net/yf_li123/article/details/76710028

MNIST数据集是一个手写体数据集,简单说就是一堆这样东西

MNIST的官网地址是MNIST; 通过阅读官网我们可以知道,这个数据集由四部分组成,分别是

;

也就是一个训练图片集,一个训练标签集,一个测试图片集,一个测试标签集;我们可以看出这个其实并不是普通的文本文件或是图片文件,而是一个压缩文件,下载并解压出来,我们看到的是二进制文件,其中训练图片集的内容部分如此

这些二进制数据如何解释呢?在这里我们只针对官网的说法,对训练图片集和训练标签集进行解说,测试集是一样的道理。

针对训练标签集,官网上陈述有

官网说法,训练集是有60000个用例的,也就是说这个文件里面包含了60000个标签内容,每一个标签的值为0到9之间的一个数;回到我们的训练标签集上,按上面说的,我们先解析每一个属性的含义,offset代表了字节偏移量,也就是这个属性的二进制值的偏移是多少;type代表了这个属性的值的类型;value代表了这个属性的值是多少;description是对这个的说明;所以呢,这里对上面的进行一下说明,它的说法是“从第0个字节开始有一个32位的整数,它的值是0x00000801,它是一个魔数;从第4个字节开始有一个32位的整数,它的值是60000,它代表了数据集的数量;从第8个字节开始有一个unsigned byte,它的值是??,是一个标签值….”;我们现在针对我们看到的文件进行解说,看图

首先我们知道用sublime打开这个文件(是解压过的),是用十六进制表示的,也就是说里面的每一个数字代表了四个位,两个数字代表了一个字节;我们首先看到偏移量为0字节处0000 0801它就是代表了魔数,它的值为0000

0801,这里补充说一下什么是魔数,其实它就是一个校验数,用来判断这个文件是不是MNIST里面的train-labels.idx1-ubyte文件;接着往下看偏移量为4字节处0000 ea60,我们知道按照上面说过的这个应该是表示容量数,也就是60000,而60000的十六进制就是ea60,满足;再看偏移量为8字节处05,它就表示我们的标签值了,也就是说第一个图片的标签值为5,后面的也是依此类推;

接下来我们来看训练图片集,同样从官网上可以看到

其解说与上面的标签文件类似,但是这里还要补充说明一下,在MNIST图片集中,所有的图片都是28×28的,也就是每个图片都有28×28个像素;看回我们的上述图片,其表示,我们的train-images-idx3-ubyte文件中偏移量为0字节处有一个4字节的数为0000 0803表示魔数;接下来是0000

ea60值为60000代表容量,接下来从第8个字节开始有一个4字节数,值为28也就是0000 001c,表示每个图片的行数;从第12个字节开始有一个4字节数,值也为28,也就是0000

001c表示每个图片的列数;从第16个字节开始才是我们的像素值,用图片说话

;而且每784个字节代表一幅图片

我们可以看到文件的二进制内容同我们分析的是一样的。

补充说明:在图示中我们可以看到有一个MSB first,其全称是”Most Significant Bit first”,相对称的是一个LSB first,“Least Significant Bit”; MSB first是指最高有效位优先,也就是我们的大端存储,而LSB对应小端存储;关于大端,小端,可以参考




[python]view plaincopy

'''''

使用python解析二进制文件

'''

importnumpy as np

importstruct

defloadImageSet(filename):

binfile = open(filename,'rb')# 读取二进制文件

buffers = binfile.read()

head = struct.unpack_from('>IIII', buffers,0)# 取前4个整数,返回一个元组

offset = struct.calcsize('>IIII')# 定位到data开始的位置

imgNum = head[1]

width = head[2]

height = head[3]

bits = imgNum * width * height# data一共有60000*28*28个像素值

bitsString ='>'+ str(bits) +'B'# fmt格式:'>47040000B'

imgs = struct.unpack_from(bitsString, buffers, offset)# 取data数据,返回一个元组

binfile.close()

imgs = np.reshape(imgs, [imgNum, width * height])# reshape为[60000,784]型数组

returnimgs,head

defloadLabelSet(filename):

binfile = open(filename,'rb')# 读二进制文件

buffers = binfile.read()

head = struct.unpack_from('>II', buffers,0)# 取label文件前2个整形数

labelNum = head[1]

offset = struct.calcsize('>II')# 定位到label数据开始的位置

numString ='>'+ str(labelNum) +"B"# fmt格式:'>60000B'

labels = struct.unpack_from(numString, buffers, offset)# 取label数据

binfile.close()

labels = np.reshape(labels, [labelNum])# 转型为列表(一维数组)

returnlabels,head

if__name__ =="__main__":

file1='E:/pythonProjects/dataSets/mnist/train-images.idx3-ubyte'

file2='E:/pythonProjects/dataSets/mnist/train-labels.idx1-ubyte'

imgs,data_head = loadImageSet(file1)

print('data_head:',data_head)

print(type(imgs))

print('imgs_array:',imgs)

print(np.reshape(imgs[1,:],[28,28]))#取出其中一张图片的像素,转型为28*28,大致就能从图像上看出是几啦

print('----------我是分割线-----------')

labels,labels_head = loadLabelSet(file2)

print('labels_head:',labels_head)

print(type(labels))

print(labels)

代码:http://blog.csdn.net/qq_32166627/article/details/62218072

相关文章

网友评论

      本文标题:mnist数据集介绍

      本文链接:https://www.haomeiwen.com/subject/jklyuxtx.html