pangmq 发表于 2015-4-24 08:30:20

python读取mnist

  其实就是python怎么读取binnary file
  mnist的结构如下,选取train-images
  

TRAINING SET IMAGE FILE (train-images-idx3-ubyte):
                      
0000   32 bit integer0x00000803(2051) magic number
0004   32 bit integer60000            number of images
0008   32 bit integer28               number of rows
0012   32 bit integer28               number of columns
0016   unsigned byte   ??               pixel
0017   unsigned byte   ??               pixel
........
xxxx   unsigned byte   ??               pixel
  
  也就是之前我们要读取4个 32 bit integer
  
  试过很多方法,觉得最方便的,至少对我来说还是使用
  struct.unpack_from()
  



filename = 'train-images.idx3-ubyte'
binfile = open(filename , 'rb')
buf = binfile.read()

  先使用二进制方式把文件都读进来
  



index = 0
magic, numImages , numRows , numColumns = struct.unpack_from('>IIII' , buf , index)
index += struct.calcsize('>IIII')

  然后使用struc.unpack_from
  '>IIII'是说使用大端法读取4个unsinged int32
  
  然后读取一个图片测试是否读取成功



im = struct.unpack_from('>784B' ,buf, index)
index += struct.calcsize('>784B')
im = np.array(im)
im = im.reshape(28,28)
fig = plt.figure()
plotwindow = fig.add_subplot(111)
plt.imshow(im , cmap='gray')
plt.show()

  '>784B'的意思就是用大端法读取784个unsigned byte
  
  完整代码如下



import numpy as np
import struct
import matplotlib.pyplot as plt
filename = 'train-images.idx3-ubyte'
binfile = open(filename , 'rb')
buf = binfile.read()
index = 0
magic, numImages , numRows , numColumns = struct.unpack_from('>IIII' , buf , index)
index += struct.calcsize('>IIII')
im = struct.unpack_from('>784B' ,buf, index)
index += struct.calcsize('>784B')
im = np.array(im)
im = im.reshape(28,28)
fig = plt.figure()
plotwindow = fig.add_subplot(111)
plt.imshow(im , cmap='gray')
plt.show()

  只是为了测试是否成功所以只读了一张图片
  

  赶脚应该是读对了哈。。。
页: [1]
查看完整版本: python读取mnist