在 Keras 中使用 fit_generator 和 flow_from_directory() 时的 K 折交叉验证

数据挖掘 Python 深度学习 喀拉斯 张量流 交叉验证
2021-09-14 04:41:27

我正在使用flow_from_directory()fit_generator在我的深度学习模型中,我想使用交叉验证方法来训练 CNN 模型。

datagen = ImageDataGenerator(rotation_range=15,width_shift_range=0.2,
                             height_shift_range=0.2,shear_range=0.2,
                             zoom_range=0.2,horizontal_flip=True,
                             fill_mode='nearest')

image_size = (224, 224)
batch = 32

train_generator = datagen.flow_from_directory(train_data,
                                              target_size=image_size,
                                              batch_size=batch,
                                              classes= classes_array)

我找到了这个Youtube 视频和这个教程,但它没有用flow_from_directory()

fit_generator您知道在使用Keras时如何使用 k-fold 交叉验证flow_from_directory()吗?

2个回答

所以,我还没有找到任何关于在 fit_generator() 中应用交叉验证的解决方案,我希望它出现在 Keras 包的一次更新中,因为交叉验证是训练模型的重要组成部分。

到目前为止,我所做的基本上是先拆分数据集,然后将数据和标签传递给 fit_generator。在每一步结束时,我保存模型,在每一步开始时,我加载 preciuos 模型以继续对同一模型进行训练,但使用不同的数据集 k 倍。我正在粘贴我使用这种方法的代码部分,希望它有所帮助。

## Training with K-fold cross validation
kf = KFold(n_splits=k_folds, random_state=None, shuffle=True)
kf.get_n_splits(images_file_paths)

X = np.array(images_file_paths)
y = np.array(class_labels)

i = 1
for train_index, test_index in kf.split(X):
    trainData = X[train_index]
    testData = X[test_index]
    trainLabels = y[train_index]
    testLabels = y[test_index]

    print("=========================================")
    print("====== K Fold Validation step => %d/%d =======" % (i,k_folds))
    print("=========================================")

    trainGenerator = Generator(trainData,trainLabels,batchSize=batchSize,imageSize=imageSize,augment=True,grayMode=grayMode)
    valGenerator = Generator(testData,testLabels,batchSize=batchSize,imageSize=imageSize,augment=False,grayMode=grayMode)

    try: 
        model = load_model(weights_path, compile=True)

    except Exception as OSError:
        pass

    model.fit_generator(
            trainGenerator,
            steps_per_epoch=len(trainData),
            epochs=epochs,
            validation_data=valGenerator,
            validation_steps=len(testData))
    i+=1

尝试使用 skimage 或 keras 的预处理输入来预先将图像转换为数组,而不是生成器。生成器通常会为您执行此操作,但如果您自己编写代码,则只需几行代码,您可以按照您发布的教程进行操作。