Pickle加载CIFAR-100d

2024-04-29 14:44:12 发布

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

我正试图解除对CIFAR-100数据的锁定,但我认为我做得不对。From their example,加载文件,然后调用pickle.load()

#imports data
def unpickle(file):
    import pickle
    with open(file, 'rb') as fo:
        dict = pickle.load(fo, encoding='bytes')
    return dict

但是,当我使用CIFAR-100数据运行此命令时,它失败的原因是:

dict = pickle.load(fo, encoding='bytes')

TypeError: load() got an unexpected keyword argument 'encoding'

当我删除encoding参数时,它将出现以下错误:

X, Y, X_test, Y_test = unpickle("cifar-100-python/train")

ValueError: need more than 0 values to unpack

基本上说它没有从培训文件中检索到任何数据。这就是dict返回的结果:[]

下面是代码示例:

from __future__ import division, print_function, absolute_import
import cPickle as pickle

#imports data
def unpickle(file):
    with open(file, 'rb') as fo:
        dict = pickle.load(fo)
    return dict

print(unpickle("cifar-100-python/train")) # <-- This prints []

X, Y, X_test, Y_test = unpickle("cifar-100-python/train")

我正在运行Python2.7.10。我遗漏了什么吗?


Tags: 文件数据testimportasloadtrainpickle
3条回答

从我们在评论中的讨论来看,你的下载很糟糕。我从上面提供的链接下载了CIFAR-100数据库,使用了您提供并成功加载到数据中的unpickle的第二个版本。注意,'encoding'参数只对Python 3有效,所以我使用了您为Python 2提供的第二个版本。

具体来说,使用从存档中提取并放在当前目录中的trainpickle文件,这里是我的REPL历史记录:

In [14]: import cPickle as pickle

In [15]: def unpickle(file):
    ...:     with open(file, 'rb') as fo:
    ...:         dict = pickle.load(fo)
    ...:     return dict
    ...:

In [16]: data = unpickle('train')

In [17]: len(data)
Out[17]: 5

In [18]: data.keys()
Out[18]: ['data', 'batch_label', 'fine_labels', 'coarse_labels', 'filenames']

In [19]: data['data'].shape
Out[19]: (50000L, 3072L)

如你所见,我有一本有五把钥匙的字典。字典中用'data'键存储的值包含我们的32 x 32彩色像素数据,其中每行是图像的展开版本(32 x 32 x 3彩色通道=3072像素)。我们预计还有50000张照片。因此,请再次尝试下载数据并使用unpickle函数(您提供的第二个函数)。它应该像对我一样工作。

我将为您提供一个同时适用于Python 2.x和3.x的解决方案

import pickle
with open(file, 'rb') as fo:
    try:
        samples = pickle.load(fo)
    except UnicodeDecodeError:  #python 3.x
        fo.seek(0)
        samples = pickle.load(fo, encoding='latin1')
def unpickle(file):
import cPickle
with open(file, 'rb') as fo:
    dict = cPickle.load(fo)
return dict
dict=unpickle("file")
print dict['data'] 

使用dict['data']获取所有图像

相关问题 更多 >