如何处理大量的训练数据?

数据挖掘 大数据 张量流 喀拉斯 计算机视觉 训练
2021-09-25 14:10:16

目前,我使用图像文件并将它们转换为 *.npy 文件(保存为 numpy 数组)作为训练数据。目前这个训练数据集将近3GB。现在我有更多的图像文件,所以训练数据集会变得更大,可能高达 40 GB。而且恐怕 *.npy 文件无法保存这么大的数据文件。

有没有另一种可能的方法来存储这么大的文件?

由于我使用 Keras 构建神经网络模型,是否可以将训练数据拆分成小部分,以便在不必使用所有训练数据的情况下训练模型?

这听起来像一个合理的方法吗?

2个回答

我对 keras 和 GPU 训练做了类似的事情,但我也只有少量可用的内存。这个想法是将numpy文件拆分成更小的文件,假设每个文件有 64 个样本,然后加载每个文件并调用train_on_batch这些图像。您可以使用 keras 的train_on_batch功能来实现这一点:

train_on_batch

train_on_batch(self, x, y, class_weight=None, sample_weight=None)

它旨在对一批样本执行单个梯度更新。

自定义生成器

另一个想法是使用生成器,它为您提供给定目录的数据。它们还可以用于数据扩充,即从您的数据中随机生成新的训练数据。这是 keras 文档中的一个示例:

train_datagen = ImageDataGenerator(
        rescale=1./255,
        shear_range=0.2,
        zoom_range=0.2,
        horizontal_flip=True)

# just rescale test data
test_datagen = ImageDataGenerator(rescale=1./255)

# this generator loads data from the given directory and 32 images 
# chunks called batches. you can set this as you like
train_generator = train_datagen.flow_from_directory(
        'data/train',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

# same es the train_generator    
validation_generator = test_datagen.flow_from_directory(
        'data/validation',
        target_size=(150, 150),
        batch_size=32,
        class_mode='binary')

# loads sequentially images and feeds them to the model. 
# the batch size is set in the constructor 
model.fit_generator(
        train_generator,
        samples_per_epoch=2000,
        nb_epoch=50,
        validation_data=validation_generator,
        nb_val_samples=800)

关于数据的大小 - 您是否尝试过使用 Python tarfile 库压缩文件?您可以在每次成功的压缩操作后分块压缩它,并保留一个包含元数据的 sql db。这样,当您进行样本选择时,您可以在数据库上执行选择并仅提取您需要的文件。

我会去争取并把它分开。至于选择方法,我会踢它老派并随机选择替换。