我有大约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'))
答案 0 :(得分:5)
这是个坏主意吗?
是的,确实。
您正尝试一次性将7GB压缩图像数据加载到内存中(对于800k 256 * 256 RGB文件,大约195 GB)。这不行。您必须找到一种方法来逐个图像更新CNN,随着时间的推移保存状态。
还要考虑CCN参数集的大小。 Pickle不是为大量数据而设计的。如果您需要存储GB值的神经网络数据,那么使用数据库要好得多。如果神经网络参数集只有几MB,那么pickle就可以了。
您可能还想查看pickle.HIGHEST_PROTOCOL
的文档,这样您就不会遇到旧的未经优化的pickle文件格式。