MNIST文件解析读取
收藏
MNIST文件读取,谁来讲讲呗
def _parse_dataset(self, buffer_size=100):
self.images = []
self.labels = []
with gzip.GzipFile(self.image_path, 'rb') as image_file:
img_buf = image_file.read()
with gzip.GzipFile(self.label_path, 'rb') as label_file:
lab_buf = label_file.read()
step_label = 0
offset_img = 0
# read from Big-endian
# get file info from magic byte
# image file : 16B
magic_byte_img = '>IIII'
magic_img, image_num, rows, cols = struct.unpack_from(
magic_byte_img, img_buf, offset_img)
offset_img += struct.calcsize(magic_byte_img)
offset_lab = 0
# label file : 8B
magic_byte_lab = '>II'
magic_lab, label_num = struct.unpack_from(magic_byte_lab,
lab_buf, offset_lab)
offset_lab += struct.calcsize(magic_byte_lab)
while True:
if step_label >= label_num:
break
fmt_label = '>' + str(buffer_size) + 'B'
labels = struct.unpack_from(fmt_label, lab_buf, offset_lab)
offset_lab += struct.calcsize(fmt_label)
step_label += buffer_size
fmt_images = '>' + str(buffer_size * rows * cols) + 'B'
images_temp = struct.unpack_from(fmt_images, img_buf,
offset_img)
images = np.reshape(images_temp, (buffer_size, rows *
cols)).astype('float32')
offset_img += struct.calcsize(fmt_images)
for i in range(buffer_size):
self.images.append(images[i, :])
self.labels.append(
np.array([labels[i]]).astype('int64'))
0
收藏
请登录后评论
大概就是解压gzip文件,再根据结构读取数据
这就是传说中高度封装的API啊
不太理解这段,是不是把ASCII码拿出来了?
读取那块不会用
读取那块不会用
看着这段像是定长读取的操作
struct.unpack_from(fmt_label, lab_buf, offset_lab)
这里的fmt_label参数是作为字符传入的,用于限制每次读取的长度吧~~
大于 buffer_size 个Byte 就读出一个
lab_buf是缓存,offset_lab是偏移地址,哈哈,我就这么猜的~
这个好像c的读取风格,在内存的一个buffer上,通过改偏置地址顺序读取,是低级的语言的用法吧~~
这种磨叽事儿,直接用打包好的api就方便多了。
这都和文件结构还相关,不是好玩儿的部分,哪有深度学习好玩啊^^
有道理