我正在尝试使用此程序加载在Python 3.2中链接到此处的MNIST数据集:
import pickle import gzip import numpy with gzip.open('mnist.pkl.gz', 'rb') as f: l = list(pickle.load(f)) print(l)
不幸的是,它给了我错误:
Traceback (most recent call last): File "mnist.py", line 7, in <module> train_set, valid_set, test_set = pickle.load(f) UnicodeDecodeError: 'ascii' codec can't decode byte 0x90 in position 614: ordinal not in range(128)
然后,我尝试在Python 2.7中解码腌制的文件,然后重新编码。因此,我在Python 2.7中运行了该程序:
import pickle import gzip import numpy with gzip.open('mnist.pkl.gz', 'rb') as f: train_set, valid_set, test_set = pickle.load(f) # Printing out the three objects reveals that they are # all pairs containing numpy arrays. with gzip.open('mnistx.pkl.gz', 'wb') as g: pickle.dump( (train_set, valid_set, test_set), g, protocol=2) # I also tried protocol 0.
它运行无误,因此我在Python 3.2中重新运行了该程序:
import pickle import gzip import numpy # note the filename change with gzip.open('mnistx.pkl.gz', 'rb') as f: l = list(pickle.load(f)) print(l)
但是,它给了我与以前相同的错误。我该如何工作?
这是加载MNIST数据集的更好方法。
这似乎有点不兼容。它试图加载一个“ binstring”对象,该对象假定为ASCII,而在这种情况下,它是二进制数据。如果这是Python 3取消选取器中的错误,还是numpy对选取器的“滥用”,我不知道。
这是一种解决方法,但目前我不知道数据的意义:
import pickle import gzip import numpy with open('mnist.pkl', 'rb') as f: u = pickle._Unpickler(f) u.encoding = 'latin1' p = u.load() print(p)
在Python 2中取消选择它,然后重新选择它只会再次造成相同的问题,因此您需要将其另存为另一种格式。