cPickle非常大量的数据

时间:2015-04-21 20:00:31

标签: python neural-network convolution pickle

我有大约80万张RGB的256x256图像,超过7GB。

我想将它们用作卷积神经网络中的训练数据,并希望将它们与标签一起放在cPickle文件中。

现在,这需要占用大量内存,因为它需要与我的硬盘内存交换,并且几乎全部消耗掉。

这是个坏主意吗?

在不引起太多内存问题的情况下加载到CNN或腌制它们的更聪明/更实用的方法是什么?

这就是代码的样子

import numpy as np
import cPickle
from PIL import Image
import sys,os

pixels = []
labels = []
traindata = []
data=[]


for subdir, dirs, files in os.walk('images'):
        curdir=''
        for file in files:
                if file.endswith(".jpg"):
                        floc=str(subdir)+'/'+str(file)
                        im= Image.open(floc)
                        pix=np.array(im.getdata())
                        pixels.append(pix)
                        labels.append(1)
pixels=np.array(pixels)
labels=np.array(labels)
traindata.append(pixels)
traindata.append(labels)
traindata=np.array(traindata)
.....# do the same for validation and test data
.....# put all data and labels into 'data' array
cPickle.dump(data,open('data.pkl','wb'))

1 个答案:

答案 0 :(得分:5)

  

这是个坏主意吗?

是的,确实。

您正尝试一次性将7GB压缩图像数据加载到内存中(对于800k 256 * 256 RGB文件,大约195 GB)。这不行。您必须找到一种方法来逐个图像更新CNN,随着时间的推移保存状态。

还要考虑CCN参数集的大小。 Pickle不是为大量数据而设计的。如果您需要存储GB值的神经网络数据,那么使用数据库要好得多。如果神经网络参数集只有几MB,那么pickle就可以了。

您可能还想查看pickle.HIGHEST_PROTOCOL的文档,这样您就不会遇到旧的未经优化的pickle文件格式。