keras - 使用 keras-flow-from-dataframe 生成器训练大型数据集
问题描述
使用 keras 在 google Co-laboratory 上训练大型数据集的最佳方法是什么?
数据大小:存储在 Google 驱动器上的 3GB 图像。
搜索后,问题是数据没有在内存中获取。我阅读的所有文章中建议的解决方案是使用 keras 生成器(据我了解,它的作用是获取一个批次并训练它,然后转到下一个批次.. 等等,所以不需要获取一次将整个数据存储在内存中)。
我尝试了 keras-flow-from-dataframe 生成器。但它并没有解决问题,我仍然遭受(运行时死亡)
train_paths = pd.read_csv(path)
datagen = ImageDataGenerator(featurewise_center=True,
featurewise_center=True,
featurewise_std_normalization=True,
samplewise_std_normalization=True,
rotation_range=30,
validation_split=0.25)
train_generator=datagen.flow_from_dataframe(
dataframe=train_paths,directory= None,x_col='path',y_col='label',
subset="training",has_ext=True,
batch_size=32,target_size =(224,224),
color_mode= "rgb",seed=0,
shuffle=False,class_mode="binary",drop_duplicates=False)
def compile_and_train(model, num_epochs):
adam = Adam(lr=0.0001, beta_1=0.9, beta_2=0.999, epsilon=None, decay=10, amsgrad=False)
model.compile(optimizer= adam, loss='binary_crossentropy', metrics = ['acc'])
filepath = 'tmp/weights/' + model.name + '.{epoch:02d}-{loss:.2f}.hdf5'
checkpoint = ModelCheckpoint(filepath, monitor='loss', verbose=0, save_best_only=True, mode='auto', period=1)
STEP_SIZE_TRAIN= (train_generator.n//train_generator.batch_size)+1
STEP_SIZE_VALID= (valid_generator.n//valid_generator.batch_size)+1
Model_history=model.fit_generator(generator=train_generator,steps_per_epoch=STEP_SIZE_TRAIN,validation_data=valid_generator,validation_steps=STEP_SIZE_VALID,epochs=num_epochs, verbose=1, callbacks=[checkpoint, tensor_board],class_weight=[1])
return Model_history
MobileNet_Model= MobileNet_model(input_shape)
MobileNet_model_his= compile_and_train(MobileNet_Model, num_epochs=1)
一个建议的解决方案是手动(或通过 for 循环)划分数据,在每个 MAJOR BATCH 之后保存权重并继续为下一批训练它们......
这里有一个问题,我应该只保存模型(架构)还是只保存权重?有没有更好的解决方案来代替(for循环)?为什么使用 keras 生成器根本不能解决这个问题!!?
解决方案
推荐阅读
- python - tensorflow - 将精度与图表相关联
- javascript - 如何将用户帐户信息保存到 Firebase?
- dev-c++ - 如何调试“ISO C++ 禁止声明没有类型的‘汽车’”?
- python - 使用python提取完整的XML块
- angular - 如何提高 Angular 的(2+)变化检测性能?
- java - 如何使用@NotNull?
- linux - 如何在 perl 中流式传输不断更改文件名的日志文件内容?
- javascript - 删除字符串中的最后一个换行符
- java - 从java列表中的每个文件中获取文件名的一部分
- python - 如何进行延迟以便可以多次重播声音