【问题标题】:Memory Error : Training large dataset内存错误:训练大型数据集
【发布时间】:2018-08-15 13:45:35
【问题描述】:

内存错误

我的数据集有 70k 图像,我想通过 Conv2D 进行训练,但是当我尝试加载数据集时它会引发内存错误。我只有 4GB RAM,如何通过在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]

【问题讨论】:

  • 这 70k 张图片的总大小有多大?
  • 15 MB(100 x100) 图片

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


【解决方案1】:

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

【讨论】:

  • 但是如果我只取一个文件夹,我将在加载所有数据集后拆分我的数据集如何拆分
  • 问题是您在处理任何文件之前加载了 100% 的文件。你应该加载 1%,处理它们,然后加载下一个 1%....
  • 我如何加载每张图像或每批数据集,你能告诉我一些简单的步骤
【解决方案2】:

如果您不需要一次访问或处理所有数据,则可以将其加载到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

希望对你有帮助!

【讨论】:

    猜你喜欢
    • 2019-09-28
    • 2021-11-14
    • 1970-01-01
    • 2015-01-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-07
    • 1970-01-01
    • 2017-11-19
    相关资源
    最近更新 更多