Python cPickle:加载失败,出现UnpicklingError

2 投票
2 回答
32518 浏览
提问于 2025-04-18 16:10

我用下面的代码创建了一个pickle文件。

from PIL import Image
import pickle
import os
import numpy
import time

trainpixels = numpy.empty([80000,6400])
trainlabels = numpy.empty(80000)
validpixels = numpy.empty([10000,6400])
validlabels = numpy.empty(10000)
testpixels = numpy.empty([10408,6400])
testlabels = numpy.empty(10408)

i=0
tr=0
va=0
te=0
for (root, dirs, filenames) in os.walk(indir1):
    print 'hello'
    for f in filenames:
            try:
                    im = Image.open(os.path.join(root,f))
                    Imv=im.load()
                    x,y=im.size
                    pixelv = numpy.empty(6400)
                    ind=0
                    for ii in range(x):
                            for j in range(y):
                                    temp=float(Imv[j,ii])
                                    temp=float(temp/255.0)
                                    pixelv[ind]=temp
                                    ind+=1
                    if i<40000:
                            trainpixels[tr]=pixelv
                            tr+=1
                    elif i<45000:
                            validpixels[va]=pixelv
                            va+=1
                    else:
                            testpixels[te]=pixelv
                            te+=1
                    print str(i)+'\t'+str(f)
                    i+=1
            except IOError:
                    continue
trainimage=(trainpixels,trainlabels)
validimage=(validpixels,validlabels)
testimage=(testpixels,testlabels)

output=open('data.pkl','wb')

pickle.dump(trainimage,output)
pickle.dump(validimage,output)
pickle.dump(testimage,output)

现在我想用以下代码中的load_data()函数来读取这个pickle文件:

http://www.deeplearning.net/tutorial/code/logistic_sgd.py

这个函数是通过运行下面的代码来调用的:

http://www.deeplearning.net/tutorial/code/rbm.py

但是它返回了一个错误信息。

cPickle.UnpicklingError: A load persistent id instruction was encountered,
but no persistent_load function was specified.

看起来数据结构不匹配,但我不知道应该是什么样的。

供参考,这个pickle文件的大小超过了16GB,压缩后的gzip文件也超过了1GB。

2 个回答

1

我在使用以下代码时遇到了这个错误:

pandas.read_pickle('filepath_or_buffer'),没有指定其他的选项。我发现原来的数据是这样保存的:

compression='zip'

所以我尝试了:

pandas.read_pickle('filepath_or_buffer', compression='zip', storage_options=None)

我知道这不是直接回答提问者的问题。但这个问题在谷歌上是搜索结果第一,所以我想把这个信息加在这里。

1

我发现,使用“序列化”和“反序列化”这两个过程是很聪明的做法。这里的“反序列化”并不是和“序列化”一样的方式,所以不能直接用同样的方法来操作。在你的代码中,你是把对象一个接一个地存到同一个文件里。你把数据存了三次到同一个文件中。

如果你想把它们读回来,就得按顺序读取。你需要做的是打开文件进行“反序列化”,然后用 pickle.load 逐个读取你的对象。

with gzip.open(dataset, 'rb') as f:
    train_set = cPickle.load(f)
    valid_set = cPickle.load(f)
    test_set = cPickle.load(f)

你可以尝试一些更简单的代码,比如让 train_set, valid_set, test_set(用gzip进行序列化和反序列化)都是简单的可序列化对象,这样可以确保一切正常。

撰写回答