1.3.1 读取MNIST数据集
整个实验使⽤numpy与matplotlib库来实现
MINIST的训练集imgNum * rows * cols ⼀共有60000*28*28个像素值
MINIST的测试集imgNum * rows * cols ⼀共有10000*28*28个像素值
这⾥使⽤ numpy 中的 nbarray 类来保存图⽚像素数据 以及 图⽚label数据
并且使⽤⼆进制打开⽂档,读取⾄缓冲区。注意的是⽂件的前四个整数不是像素数据,⽽是图⽚⽂件的
基础属性。
具体实现过程参考如下代码以及注释
# 读取图⽚
def read_image(file_name):
#先⽤⼆进制⽅式把⽂件都读进来
file_handle=open(file_name,"rb") #以⼆进制打开⽂档
file_content=file_handle.read() #读取到缓冲区中
offset=0
head = struct.unpack_from('>IIII', file_content, offset) # 取前4个整数,返回
⼀个元组
offset += struct.calcsize('>IIII')
imgNum = head[1] #图⽚数
rows = head[2] #宽度
cols = head[3] #⾼度
images=np.empty((imgNum , 784))#empty,是它所常⻅的数组内的所有元素均为空,没有实
际意义,它是创建数组最快的⽅法
image_size=rows*cols#单个图⽚的⼤⼩
fmt='>' + str(image_size) + 'B'#单个图⽚的format
for i in range(imgNum):
images[i] = np.array(struct.unpack_from(fmt, file_content, offset))
offset += struct.calcsize(fmt)
return images #返回图⽚像素数据array
# 读取标签
def read_label(file_name):
file_handle = open(file_name, "rb") # 以⼆进制打开⽂档
file_content = file_handle.read() # 读取到缓冲区中
head = struct.unpack_from('>II', file_content, 0) # 取前2个整数,返回⼀个元组
offset = struct.calcsize('>II')
labelNum = head[1] # label数
bitsString = '>' + str(labelNum) + 'B' # fmt格式:'>47040000B'
label = struct.unpack_from(bitsString, file_content, offset) # 取data数据,
返回⼀个元组
return np.array(label) # 返回图⽚打标array