cPickle очень большой объем данных
У меня есть около 0,8 миллиона изображений 256x256 в RGB, что составляет более 7 ГБ.
Я хочу использовать их в качестве обучающих данных в сверточной нейронной сети и хочу поместить их в файл 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 ответ:
Разве это плохая идея?
Да, конечно.
Вы пытаетесь загрузить 7 ГБ сжатых данных изображения в память сразу (около 195 ГБ для 800k 256*256 RGB файлов). Это не сработает. Вы должны найти способ обновить свой CNN изображение за изображением, сохраняя состояние, как вы идете вперед.
Также подумайте, насколько большим будет ваш набор параметров CCN. Pickle не рассчитан на большие объемы данных. Если вам нужно хранить гигабайты данных нейронной сети, вы намного лучше с помощью базы данных. Если набор параметров нейронной сети составляет всего несколько МБ, Пикл будет в порядке.
Возможно, вы также захотите взглянуть на документацию для
pickle.HIGHEST_PROTOCOL
, таким образом, вы не застряли со старым и неоптимизированным форматом файла pickle.