Python cPickle:加载失败并出现 UnpicklingError

问题描述 投票:0回答:2

我使用以下内容制作了一个 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() 函数进行 unpickle: 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

python numpy pickle
2个回答
1
投票

我发现酸洗和反酸洗是明智的。 这里你不像腌制那样解腌,所以它不起作用。在您的代码中,您将在同一文件中一个接一个地腌制对象。您对同一个文件进行了三次腌制。 如果你想回读它们,你必须按顺序阅读。 您要做的就是打开文件进行 unpickle,然后按顺序

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 进行酸洗和反酸洗)是简单的可酸洗对象,只是为了确定。


0
投票

我在使用时遇到这个错误:

pandas.read_pickle('filepath_or_buffer') 不指定其他酸洗选项。我看到原来的酸洗是用的:

compression='zip'

所以我尝试了:

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

我很高兴这不是对OP问题的直接回答。但这个问题是谷歌最热门的问题,所以我想我应该在这里添加它。

© www.soinside.com 2019 - 2024. All rights reserved.