目前,我使用图像文件并将它们转换为 *.npy 文件(保存为 numpy 数组)作为训练数据。目前这个训练数据集将近3GB。现在我有更多的图像文件,所以训练数据集会变得更大,可能高达 40 GB。而且恐怕 *.npy 文件无法保存这么大的数据文件。
有没有另一种可能的方法来存储这么大的文件?
由于我使用 Keras 构建神经网络模型,是否可以将训练数据拆分成小部分,以便在不必使用所有训练数据的情况下训练模型?
这听起来像一个合理的方法吗?
目前,我使用图像文件并将它们转换为 *.npy 文件(保存为 numpy 数组)作为训练数据。目前这个训练数据集将近3GB。现在我有更多的图像文件,所以训练数据集会变得更大,可能高达 40 GB。而且恐怕 *.npy 文件无法保存这么大的数据文件。
有没有另一种可能的方法来存储这么大的文件?
由于我使用 Keras 构建神经网络模型,是否可以将训练数据拆分成小部分,以便在不必使用所有训练数据的情况下训练模型?
这听起来像一个合理的方法吗?
我对 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。这样,当您进行样本选择时,您可以在数据库上执行选择并仅提取您需要的文件。
我会去争取并把它分开。至于选择方法,我会踢它老派并随机选择替换。