官网一探
- 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对应小端存储;关于大端,小端,可以 参考
代码来也
- 相信通过上面的解析,对于MNIST的文件组织和内容已经有所了解,接下来我们便对文件内容进行读取;
- 自己动手型
- 主要是使用了python的numpy进行数据类型转换和struct模型进行二进制文件的格式化读取;关于struct可以参考 struct;核心代码如下
_tag = '>' #使用大端读取
_twoBytes = 'II' #读取数据格式是两个整数
_fourBytes = 'IIII' #读取的数据格式是四个整数
_pictureBytes = '784B' #读取的图片的数据格式是784个字节,28*28
_lableByte = '1B' #标签是1个字节
_msb_twoBytes = _tag + _twoBytes
_msb_fourBytes = _tag + _fourBytes
_msb_pictureBytes = _tag + _pictureBytes
_msb_lableByte = _tag + _lableByte
def getImage(filename = None):
binfile = open(filename, 'rb') #以二进制读取的方式打开文件
buf = binfile.read() #获取文件内容缓存区
binfile.close()
index = 0 #偏移量
numMagic, numImgs, numRows, numCols = struct.unpack_from(_msb_fourBytes, buf, index)
index += struct.calcsize(_fourBytes)
images = []
for i in xrange(numImgs):
imgVal = struct.unpack_from(_msb_pictureBytes, buf, index)
index += struct.calcsize(_pictureBytes)
imgVal = list(imgVal)
#for j in range(len(imgVal)):
# if imgVal[j] > 1:
# imgVal[j] = 1
images.append(imgVal)
return np.array(images)
def getlable(filename=None) :
binfile = open(filename, 'rb')
buf = binfile.read() #获取文件内容缓存区
binfile.close()
index = 0 #偏移量
numMagic, numItems = struct.unpack_from(_msb_twoBytes,buf, index)
index += struct.calcsize(_twoBytes)
labels = []
for i in range(numItems):
value = struct.unpack_from(_msb_lableByte, buf, index)
index += struct.calcsize(_lableByte)
labels.append(value[0]) #获取值的内容
return np.array(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
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 使用python已经处理过的包
- 主要是使用了已经处理过的压缩包 mnist.pkl.gz,前利用cPickle模块从pkl文件中加载出已经处理过的文件内容;关于这个数据集的内容是,它加载完毕后,会返回三个数组,这与mnist官网不同,因为为了方便模型的训练,mnist.pkl将60000个训练数据分成了50000个训练数据和10000校正数据集;每个数组由两部分内容组成,一个图片数组和一个标签数组,图片数组的每一行代表一个图片的像素,有784个元素(28×28);核心代码如下
def load_data(filename = None):
f = gzip.open(filename, 'rb')
training_data, validation_data, test_data = cPickle.load(f)
return (training_data, validation_data, test_data)
- 1
- 2
- 3
- 4
- 全部的代码地址 mnist
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
</div>
官网一探
- 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对应小端存储;关于大端,小端,可以 参考
代码来也
- 相信通过上面的解析,对于MNIST的文件组织和内容已经有所了解,接下来我们便对文件内容进行读取;
- 自己动手型
- 主要是使用了python的numpy进行数据类型转换和struct模型进行二进制文件的格式化读取;关于struct可以参考 struct;核心代码如下
_tag = '>' #使用大端读取
_twoBytes = 'II' #读取数据格式是两个整数
_fourBytes = 'IIII' #读取的数据格式是四个整数
_pictureBytes = '784B' #读取的图片的数据格式是784个字节,28*28
_lableByte = '1B' #标签是1个字节
_msb_twoBytes = _tag + _twoBytes
_msb_fourBytes = _tag + _fourBytes
_msb_pictureBytes = _tag + _pictureBytes
_msb_lableByte = _tag + _lableByte
def getImage(filename = None):
binfile = open(filename, 'rb') #以二进制读取的方式打开文件
buf = binfile.read() #获取文件内容缓存区
binfile.close()
index = 0 #偏移量
numMagic, numImgs, numRows, numCols = struct.unpack_from(_msb_fourBytes, buf, index)
index += struct.calcsize(_fourBytes)
images = []
for i in xrange(numImgs):
imgVal = struct.unpack_from(_msb_pictureBytes, buf, index)
index += struct.calcsize(_pictureBytes)
imgVal = list(imgVal)
#for j in range(len(imgVal)):
# if imgVal[j] > 1:
# imgVal[j] = 1
images.append(imgVal)
return np.array(images)
def getlable(filename=None) :
binfile = open(filename, 'rb')
buf = binfile.read() #获取文件内容缓存区
binfile.close()
index = 0 #偏移量
numMagic, numItems = struct.unpack_from(_msb_twoBytes,buf, index)
index += struct.calcsize(_twoBytes)
labels = []
for i in range(numItems):
value = struct.unpack_from(_msb_lableByte, buf, index)
index += struct.calcsize(_lableByte)
labels.append(value[0]) #获取值的内容
return np.array(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
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 使用python已经处理过的包
- 主要是使用了已经处理过的压缩包 mnist.pkl.gz,前利用cPickle模块从pkl文件中加载出已经处理过的文件内容;关于这个数据集的内容是,它加载完毕后,会返回三个数组,这与mnist官网不同,因为为了方便模型的训练,mnist.pkl将60000个训练数据分成了50000个训练数据和10000校正数据集;每个数组由两部分内容组成,一个图片数组和一个标签数组,图片数组的每一行代表一个图片的像素,有784个元素(28×28);核心代码如下
def load_data(filename = None):
f = gzip.open(filename, 'rb')
training_data, validation_data, test_data = cPickle.load(f)
return (training_data, validation_data, test_data)
- 1
- 2
- 3
- 4
- 全部的代码地址 mnist
<link rel="stylesheet" href="https://csdnimg.cn/release/phoenix/template/css/markdown_views-ea0013b516.css">
</div>