文章目录
第1关:创建训练样本批量生成器
@任务描述:
补充完成函数:参考任务生成器创建代码,为分类器提供批量样本,每个样本为(图片,标签)对。
(1)输入:def dataReader(imgfile, labelfile, batch_size, drop_last)
imgfile:为IDX图片文件;labelfile:为IDX标签文件,标签顺序与图片顺序相同;batch_size:为生成器提供的批量样本数量;drop_last:是否丢弃不足批量的剩余样本。
(2)返回:batch_size长度的列表,列表中元素为图像和标签对。
形式如下:[(图像1,标签1),(图像2,标签2),(图像3,标签3)…]
#注意:训练时样本顺序必须打乱,随机选取。
列表中的图像元素为28*28的矩阵,类型为<class ‘numpy.ndarray’>
标签元素标量,类型为<class ‘numpy.uint8’>即不改变原文件中存储的数据元素类型。
##1.加载数据
import struct,random,numpy as np
code2type = {0x08: 'B', 0x09: 'b', 0x0B: 'h', 0x0c: 'i', 0x0D: 'f', 0x0E: 'd'}
def readMatrix(filename):
with open(filename,'rb') as f:
buff = f.read()
offset = 0
fmt = '>HBB'#格式定义,>表示高位在前,I表示4字节整数
_,dcode,dimslen = struct.unpack_from(fmt,buff,offset)
offset += struct.calcsize(fmt)
fmt = '>{}I'.format(dimslen)
shapes = struct.unpack_from(fmt,buff,offset)
offset += struct.calcsize(fmt)
fmt = '>'+ str(np.prod(shapes)) + code2type[dcode]
matrix = struct.unpack_from(fmt,buff,offset)
matrix = np.reshape(matrix,shapes).astype(code2type[dcode])
return matrix
def dataReader(imgfile, labelfile, batch_size, drop_last):
with open(imgfile,'rt') as f: # 引入with可以自动调用close()方法
readers = reader(f)
imgdatas = list(readers)
#print(labeldatas)
img_datas = np.array(imgdatas).astype("float32") # 因为模型需要float32格式的数据,所以在这里做下类型转换
with open(labelfile,'rt') as f: #引入with可以自动调用close()方法
readers = reader(f)
labeldatas = list(readers)
#print(labeldatas)
label_datas = np.array(labeldatas).astype("float32")