【发布时间】:2012-07-03 13:58:57
【问题描述】:
我正在尝试使用此程序在 Python 3.2 中加载链接 here 的 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)
但是,它给了我和以前一样的错误。我该如何让它发挥作用?
【问题讨论】:
-
2.7 和 3.x 之间存在兼容性中断。特别是字符串与 unicode。并且选择一个 numpy 对象需要两个系统都加载 numpy 模块,但这些模块是不同的。抱歉,我没有答案,但这可能是不可行的,也可能是不可取的。如果这是大事(gzip),也许 hdf5 和 pytables??
-
@PhilCooper:谢谢,您的评论(将其作为答案发布?)让我找到了正确的答案。我本可以使用 hdf5,但学习起来似乎很复杂,所以我使用了 numpy.save/load 并且这很有效。
-
h5py 使用起来非常简单,几乎可以肯定比使用酸洗 numpy 数组解决模糊的兼容性问题要容易得多。
-
你说你“在 Python 2.7 下运行这个程序”。好的,但是你在 3.2 下运行了什么? :-) 一样吗?
-
@LennartRegebro:在运行第二个处理数组的程序后,我在 Python 3.2 中运行了第一个程序(替换文件名 mnistx.pkl.gz)。它不起作用,我认为这说明了某种不兼容。
标签: python python-3.x pickle