图像的K折交叉验证

时间:2020-10-31 22:08:19

标签: keras deep-learning

比方说,我有一些分为3类(“猫”,“狗”,“鼠标”)的图片,我的DL网络是用keras编写的。 我使用的设计与此图片相同(1):

Picture 1

我将数据分为三个不同的文件夹:培训,验证和测试。 网在给定图片的情况下应该能够识别猫,狗或鼠标。我得到的准确度约为98%。

有效。 但是出于某些原因,我需要更改该设计。我想使用K折交叉验证过程,现在该架构应类似于(2):

Picture 2

现在我的问题是我不知道如何根据图2中的模式拆分和分发原始数据。

我只能想象2种不同的方式。让我们暂时忘记测试目录:

  1. 我创建2个文件夹:“培训”和“验证”。两者的结构都与图1相同:每个类别都有三个子目录。现在的问题是:从 Fold 1 升级到 Fold 3 时,是否应该移动数据?或者我可以将图像分配到子目录中?

  2. 我创建2个文件夹:“ Training”和“ Validation”,但我将所有图像混合在一起。没有子目录。在这种情况下,我的问题是我失去了图片名称和上面的宠物之间的联系。我该如何告诉Keras,应该识别哪只动物?

我个人将所有图像混合在一起,无论它们显示什么。但是我会将内容的信息保存到文件中。在这种情况下,我将目录(验证或培训)和一个包含所有文件名称及其内容的文件传递给Keras。

您有什么建议?

1 个答案:

答案 0 :(得分:0)

好的,我可以回答我自己的问题。

最简单的方法就是在python脚本中以用户Kfold的形式sklearn

from sklearn.model_selection import KFold

在那之后,您需要使KFold保持正常状态

kfold = KFold(n_splits = 4, shuffle = True)

,然后遍历拆分后的数据集,如:

datagen = ImageDataGenerator(rescale = 1. / 255.)


for train, test in kfold.split(df_data):
    
    # df is the whole dataset (all together!)
    df_train = df.iloc[train, :]  # Look that train is coming from the for in .. loop
    df_test  = df.iloc[test, :]  # The same for test

    train_generator = datagen.flow_from_dataframe(dataframe = df_train,
                                                  directory = dataset_dir,
                                                  ... )

    test_generator = datagen.flow_from_dataframe(dataframe = df_test,
                                                 directory = dataset_dir,
                                                 ...)


    model = models.Sequential()
    .....

    model.compile(...)
    model.fit(...)

就完成了!现在,数据集已划分为多个分区!!! 注意,该类ImageDataGenerator不在for循环中!!! 并且请注意,请注意,方法(模型creation, compile() and fit()必须 在for循环中。

上面的代码对我来说很好。