我正在处理43744张图像的数据集,我已经对其进行了预处理,使其具有相同的大小。所有图像都存储在一个大的Numpy形状数组中(43744、299、299、1)。完整的numpy阵列大小约为4GB。
我正在使用Keras在火车数据上训练卷积神经网络,对形状(6011,299,299,1)的验证数据进行验证,并对单独的形状(6011,299,299)测试集进行预测,1)。
如果我将批处理大小设置为16,则一切工作正常,否则会出现内存问题,因为我的设置的可用RAM约为13GB。
现在,如果我试图通过使用Keras内置的ImageDataGenerator来扩充数据以使模型更健壮,那么在使用flow方法时会遇到内存问题:
#Create image data generator
image_gen = ImageDataGenerator(
rotation_range=20,
width_shift_range=.15,
height_shift_range=.15,
horizontal_flip=True,
vertical_flip=True)
batch_size = 1
num_epochs = 1
model = load_model()
model.compile(loss='categorical_crossentropy',
optimizer='adam',
metrics=['accuracy'])
model.fit_generator(image_gen.flow(train_data, train_labels,
batch_size=batch_size, shuffle = True), validation_data=(validation_data,
validation_labels),
steps_per_epoch= train_data.shape[0]//batch_size,
epochs=epochs, callbacks=callbacks_list,
verbose=1)
即使将批处理大小设置为1,也会出现内存错误。是否可以选择在内存中的迷你批中增加数据并在处理新的迷你批处理时将其删除?
我在网上阅读的另一种选择是使用描述性的类名将所有经过预处理的图像保存到单独子目录中的硬盘上,并使用flow_from_directory()方法。为此,是否需要将当前存储在NumPy数组中的所有预处理图像再次转换为单独的图像?如果是,如何将带有相应标签的图像转换为具有描述性目录名称的正确文件?