我试图使用以下程序在Python 3.2中加载MNIST dataset linked here:

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)

然后,我try 在Python 2.7中解码pickle文件,并对其重新编码.所以,我用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)

然而,它给了我和以前一样的错误.我怎样才能让它工作?


This is a better approach for loading the MNIST dataset.

推荐答案

这似乎有点不相容.它试图加载一个"binstring"对象,该对象被假定为ASCII,而在本例中,它是二进制数据.如果这是Python3解pickler中的一个bug,或者是numpy对pickler的"误用",我不知道.

这里有一些变通方法,但我不知道数据在这一点上有多大意义:

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)

在Python2中取消勾选,然后重新勾选,只会再次产生相同的问题,因此需要将其保存为另一种格式.

Python-3.x相关问答推荐

Python ModuleNotFound错误,即使安装了模块

海象表达可以放在方括号中而不是括号中吗?

模型中的__str__方法在Django管理面板中生成大量重复查询

给定panda代码的分组和百分比分布pyspark等价

类变量的Python子类被视为类方法

如何通过 python 使用 auth no priv 获取 SNMPv3?

从列表的元素和python中的多个多索引数据帧执行方程

无法提出给定 for 循环的原因 (Python 3.11)

如何对具有多个列值的 pandas 数据框进行数据透视/数据透视表

Jupyter Notebook 拒绝打印一些字符串

过滤阈值大小数据以使用 Pyspark 或 Python 读取

Python:如何从句子/段落中提取地址(非正则表达式方法)?

类型提示和链式赋值以及多重赋值

使用 Python 解析 JSON 嵌套字典

Python3 AttributeError:列表对象没有属性清除

ImportError:没有名为资源的模块

Python - 使用 OpenCV 将字节图像转换为 NumPy 数组

如何使用pandas python获取数据框中每列的最大长度

为什么 virtualenv 会有效地禁用 Python 3 制表符补全?

字典理解中的操作顺序