idx-ubyte文件解析

2017-11-19 02:19

Mnist手写数字数据库是著名的神经网络入门级训练集,它图像文件的后缀名一般为idx3-ubyte,图像标签文件后缀名为idx1-ubyte。它分为两种图像集,一个训练集,一个测试集。它内置的图像大小为28*28,可以在这里下载:http://yann.lecun.com/exdb/mnist/
    一共四个文件,训练集和它的标签集,测试集和它的标签集,解析规则在页面中有说明。


这里通过python的struct库进行解析:
 

#需要导入的库,struct是一个很常用的二进制解析库
import numpy as np 
import struct

 def decode_idx3_ubyte(idx3_ubyte_file):#此函数用来解析idx3文件,idx3_ubyte_filec指定图像文件路径
    #读取二进制数据
    bin_data=open(idx3_ubyte_file,'rb').read()
    #解析文件头信息,依次为魔数、图片数量、每张图片高、每张图片宽
    offest=0
    fmt_header='>iiii'    magic_number,num_images,num_rows,num_cols=struct.unpack_from(fmt_header,bin_data,offest)
    print('魔数:%d,图片数量:%d,图片大小:%d%d' % (magic_number,num_images,num_rows,num_cols))
    #解析数据集
    image_size=num_rows*num_cols
    offest += struct.calcsize(fmt_header)
    fmt_image='>'+str(image_size)+'B'
    images=np.empty((num_images,num_rows,num_cols))
    for i in range(num_images):
        if (i+1)%10000==0:
            print('已解析%d'%(i+1)+'张')        images[i]=np.array(struct.unpack_from(fmt_image,bin_data,offest)).reshape((num_rows,num_cols))
        offest+=struct.calcsize(fmt_image)
    return images
'''images是一个三维数组,images[i][a][b]表示第i张图片的倒数第a行,b列的像素'''
def decode_idx1_ubyte(idx1_ubyte_file):#解析idx1文件函数,idx1_ubyte_file指定标签文件路径
    #读取二进制数据
    bin_data=open(idx1_ubyte_file,'rb').read()
    #解析文件头信息,依次为魔数和标签数
    offest=0
    fmt_header='>ii'
    magic_number,num_images=struct.unpack_from(fmt_header,bin_data,offest)
    print('魔数:%d,图片数量:%d张' % (magic_number,num_images))
    #解析数据集
    offest+=struct.calcsize(fmt_header)
    fmt_image='>B'
    labels=np.empty(num_images)
    for i in range(num_images):
        if (i+1)%10000==0:
            print('已解析:%d'%(i+1)+'张')
        labels[i]=struct.unpack_from(fmt_image,bin_data,offest)[0]
        offest+=struct.calcsize(fmt_image)
    print(labels[0])
    return labels
'''labels是一个一维数组,每个元素都一一对应images[i]'''


运行结果如下:

idx-ubyte文件解析_第1张图片

                                                                '''————雾雨流云'''

 

你可能感兴趣的:(python)