【问题标题】:Python cPickle: load fails with UnpicklingErrorPython cPickle:加载失败并出现 UnpicklingError
【发布时间】:2014-08-06 02:05:35
【问题描述】:

我使用以下内容制作了一个泡菜文件。

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() 函数来解压: 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

【问题讨论】:

  • 这很奇怪。您通过 I/O 顺序地腌制三个结构,然后尝试将它们作为一个元组取消腌制。您可以尝试使用pickle.dump((trainimage, validimage, testimage), output) 挑选它们吗?
  • @SteveK 这有可能解决问题吗?腌制文件花了大约 3 个小时,所以在不确定的情况下,我有点犹豫......
  • @SteveK btw cPickle.load(f) 本身似乎会导致错误,所以我不确定我将它们作为元组解开的方式是否是原因..
  • 我明白了。我发现酸洗和解酸很聪明。但是你不会像腌制一样去腌制,所以它不能工作。在这里,您想取消腌制一个元组,但您还没有腌制一个元组。您需要做的是打开文件以进行 unpickling,然后依次pickle.load 每个对象。
  • 你给f分配了什么?

标签: python numpy pickle


【解决方案1】:

我发现酸洗和解酸很聪明。 在这里,您不会以与腌制相同的方式进行腌制,因此无法正常工作。在您的代码中,您在同一文件中一个接一个地腌制对象。您对同一个文件腌制了三遍。 如果你想把它们读回来,你必须进行顺序阅读。 您需要做的是打开文件以进行 unpickling,然后依次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 进行酸洗和解酸)是简单的可酸洗对象,以确保这一点。

【讨论】:

  • 感谢您的回答,但它导致了同样的错误.. :(
  • 供您参考,我正在使用此代码 deeplearning.net/tutorial/code/logistic_sgd.py 的 load_data() 进行 unpickling
  • 你的编辑现在给了我一个 cPickle.UnpicklingError: invalid load key, ''。 --> 难道是因为我打开的是data.pkl.gz而不是data.pkl?
  • data.pkl.gz 存在吗?如果是这样,并且您以与在此文件中加载对象相同的方式(使用gzip.opened 文件)保存了对象,则应该没有问题
  • 对不起,它没用......:(它仍然给我来自 train_set=cPickle.load(f) 的相同的持续加载错误..
猜你喜欢
  • 2020-10-02
  • 1970-01-01
  • 1970-01-01
  • 2018-08-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-04-12
  • 2014-12-27
相关资源
最近更新 更多