将numpy/csv转换为MNIST二进制文件:IDX2numpy合适吗?

2024-09-30 18:32:18 发布

您现在位置:Python中文网/ 问答频道 /正文

我有原始/原始格式的MNIST数据集

我想将其转换为CSV,将额外的培训数据附加到文件末尾,然后将其转换回ubyte数据

我可以将数据转换为CSV,如下所示:

import json
import sys

def convert(imgf, labelf, outf, n):
    f = open(imgf, "rb")
    o = open(outf, "w")
    l = open(labelf, "rb")
 
    f.read(16)
    l.read(8)
    images = []
 
    for i in range(n):
        image = [ord(l.read(1))]
        for j in range(28*28):
            image.append(ord(f.read(1)))
        images.append(image)
 
    for image in images:
        o.write(",".join(str(pix) for pix in image)+"\n")
    f.close()
    o.close()
    l.close()
 
convert("train-images-idx3-ubyte", "train-labels-idx1-ubyte","mnist_train.csv", 60000)
convert("t10k-images-idx3-ubyte", "t10k-labels-idx1-ubyte","mnist_test.csv", 10000)

…然后我需要添加额外的训练数据行(尚未解决),然后我想将数据重新编码回原始的ubyte数据,因为数据集正在被输入到需要ubyte数据的管道中

我找到了这个我认为可能有用的图书馆:

import csv
import sys
import numpy as np
import idx2numpy

with open(sys.argv[1], 'r') as f:
    data = list(csv.reader(f, delimiter=","))
data = np.array(data, dtype=np.float)
idx2numpy.convert_to_file('myfile_copy.idx', data)
f_write = open('myfile_copy2.idx', 'wb')
idx2numpy.convert_to_file(f_write, data)

但是,当我查看输出时,原始MNIST ubyte数据如下所示:

'T???<$?????????????ƪ4CrHr????????????BCCC;??jS????S???,;??>??? ??:~??K??9??????#&??M??s???4=???4y???(y??t}????]????????????Վ???z4??? 
                                                                                                                                      ???M??z??A???Au???
L????????????
             ???#????N???
                         ????????
                                 ??????+%????

但是使用idx2numpy代码的输出如下所示:

'@@U@g @c?@b?@N@B@k?@o?@o?@o?@o?@n @h?@h?@h?@h?@h?@h?@h?@h?@e@@J@P?@\?@R@\?@d`@l`@o?@l @o?@o?@o?@o@@l?@o?@o?@a?@1@P?@,@P?@P?@P?@M?@5@m?@o?@Z?@T?@o?@j @2@6@m @o?@T?@` @o?@m?@F@M?@o @o?@O@`?@o?@g`@@"@i?@o@M@_?@o?@f?@R?@o`@n@L?@3@k?@o?@d?@i`@o?@k`@A?@C@o?@o?@S@@?@l@o?@\???@`?@o?@o?@J@N?@n@@o?@o?@J@^@@o?@o?@k`@D@^@@o?@i?@2@@]@_@@e`@o?@o?@b?@W@@e @o?@o?@o?@o?@o?@o?@k@@>@e @o?@o?@o?@j?@a?@f@o?@o?@^?@J@o@@o?@j@@@@

有人能解释一下这里发生了什么(除了它显然是其他二进制类型之外)以及如何修复它吗


Tags: csv数据inimageimportconvertforread