内存错误:训练大型数据集

时间:2018-03-07 12:40:17

标签: python python-3.x keras hdf5 hdf5storage

  

内存错误

我的数据集有70k图像,我想通过Conv2D训练但是当我试图加载数据集时它会引发内存错误。我只有4GB内存,如何通过在HDF5中创建数据集,通过HDF5矩阵解决此问题?然后把它加载到火车上,我猜它会占用更少的内存。我尝试了一些教程来创建HDF5数据集,但这个过程是在发生错误的地方之后发生的。我做错了什么?请问问题是否不清楚。

datagen=ImageDataGenerator(rotation_range=40,
                            width_shift_range=0.2,
                            height_shift_range=0.2,
                          rescale=1./255,
                          shear_range=0.2,
                          zoom_range=0.2,
                          horizontal_flip=True)

batch_size=28
num_classes=37
epochs=100

os.chdir("E:");
path="Dataset/One";
classes=os.listdir(path)
x=[]#Datapoints 
y=[]#labels 
for fol in classes:
    imgfiles=os.listdir(path+u'\\'+fol);
    for img in imgfiles:
        im=Image.open(path+u'\\'+fol+u'\\'+img);
        im=numpy.asarray(im)/255;
        x.append(im)
        y.append(fol)
x=numpy.array(x)
y=numpy.array(y)
#memory error####################################################
x=x.reshape((-1,100,100,1))

n=x.shape[0]
randomize=numpy.arange(n)
numpy.random.shuffle(randomize)
randomize
x=x[randomize]
y=y[randomize]

2 个答案:

答案 0 :(得分:4)

您的问题是您尝试一次加载所有数据,并且它比您的RAM大得多。您只需加载一个批次并对其进行处理,然后丢弃该批次并继续。一种自然的方法可能是在for fol in classes循环内部 - 将每个fol值视为一个批处理,并一次适合一个批处理。

答案 1 :(得分:0)

如果您不需要一次访问或处理所有数据,则可以在chunks中加载。

如果它是csv文件,如果你可以使用pandas,那么你可以这样做:

import pandas as pd
for chunk in pd.read_csv('dataset/movies.csv', chunksize=1000):
    # use this chunk for processing and/or training

希望它有所帮助!