Pickle加载CIFAR-100数据

时间:2017-05-10 14:12:14

标签: python python-2.7 tensorflow pickle training-data

我正在尝试取消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()得到了一个意外的关键字参数' encoding'

当我删除encoding参数时,它会出错:

  

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

     

ValueError:需要超过0个值才能解压缩

基本上声明它没有从训练文件中检索到任何数据。这是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")

我正在运行python 2.7.10。我错过了什么吗?

4 个答案:

答案 0 :(得分:1)

根据我们在评论中的讨论,看起来你的下载不好。我从上面提供的链接下载了CIFAR-100数据库,使用了您提供的第二个unpickle版本并成功加载到数据中。请注意,'encoding'参数仅对Python 3有效,因此我使用了您提供的第二个版本,因为它适用于Python 2。

具体来说,使用我从存档中提取并放在当前目录中的train pickle文件,这是我的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)

正如你所看到的,我得到了一个包含5个键的字典。与字典中的'data'键一起存储的值包含我们的32 x 32颜色像素数据,其中每行是图像的展开版本(32 x 32 x 3颜色通道= 3072像素)。我们还期待着50000张图片。因此,请尝试再次下载数据并使用您的unpickle功能 - 您提供的第二个功能。它应该像对我一样工作。

答案 1 :(得分:1)

我将为您提供适用于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')

答案 2 :(得分:0)

def unpickle(file):
import cPickle
with open(file, 'rb') as fo:
    dict = cPickle.load(fo)
return dict
dict=unpickle("file")
print dict['data'] 

使用dict [&#39; data&#39;]获取所有图片

答案 3 :(得分:0)

取代:

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

使用:

def unpickle(file):
    import cPickle
    with open(file, 'rb') as fo:
        dict = cPickle.load(fo)
    return dict