首页 炼丹房 帖子详情
MNIST文件解析读取
收藏
快速回复
炼丹房 问答新手上路 1010 13
MNIST文件解析读取
收藏
快速回复
炼丹房 问答新手上路 1010 13

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
收藏
回复
全部评论(13)
时间顺序
AIStudio810258
#2 回复于2021-02

大概就是解压gzip文件,再根据结构读取数据

0
回复
AIStudio810260
#3 回复于2021-02

这就是传说中高度封装的API啊

0
回复
AIStudio810260
#4 回复于2021-02
大概就是解压gzip文件,再根据结构读取数据

不太理解这段,是不是把ASCII码拿出来了?

                    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
0
回复
AIStudio810259
#5 回复于2021-02
大概就是解压gzip文件,再根据结构读取数据

读取那块不会用

0
回复
AIStudio810259
#6 回复于2021-02
大概就是解压gzip文件,再根据结构读取数据

读取那块不会用

0
回复
AIStudio810258
#7 回复于2021-02
不太理解这段,是不是把ASCII码拿出来了? [代码]

看着这段像是定长读取的操作

0
回复
AIStudio810258
#8 回复于2021-02

struct.unpack_from(fmt_label, lab_buf, offset_lab)

这里的fmt_label参数是作为字符传入的,用于限制每次读取的长度吧~~

0
回复
AIStudio810258
#9 回复于2021-02

大于 buffer_size 个Byte 就读出一个

0
回复
AIStudio810258
#10 回复于2021-02

lab_buf是缓存,offset_lab是偏移地址,哈哈,我就这么猜的~

0
回复
AIStudio810258
#11 回复于2021-02
读取那块不会用

这个好像c的读取风格,在内存的一个buffer上,通过改偏置地址顺序读取,是低级的语言的用法吧~~

0
回复
AIStudio810258
#12 回复于2021-02

这种磨叽事儿,直接用打包好的api就方便多了。

0
回复
AIStudio810258
#13 回复于2021-02
这种磨叽事儿,直接用打包好的api就方便多了。

这都和文件结构还相关,不是好玩儿的部分,哪有深度学习好玩啊^^

0
回复
AIStudio810259
#14 回复于2021-02
这都和文件结构还相关,不是好玩儿的部分,哪有深度学习好玩啊^^

有道理

0
回复
在@后输入用户全名并按空格结束,可艾特全站任一用户