mnist数据集表示

官网一探

  • 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>

猜你喜欢

转载自blog.csdn.net/m0_37192554/article/details/81109432
今日推荐