如何对目录中的 keras 图像数据集使用交叉验证?

Posted

技术标签:

【中文标题】如何对目录中的 keras 图像数据集使用交叉验证?【英文标题】:How to use cross-validation with keras image datasets from directories? 【发布时间】:2021-05-28 07:57:13 【问题描述】:

我在 keras 中有一个图像数据集,我在训练和测试之间直接从各自的函数分别加载:

from tensorflow import keras

tds = keras.preprocessing\
    .image_dataset_from_directory('dataset_folder', seed=123,
                                  validation_split=0.35, subset='training')

vds = keras.preprocessing\
    .image_dataset_from_directory('dataset_folder', seed=123,
                                  validation_split=0.35, subset='validation')

然后我会经历我的神经网络的通常阶段:

from tensorflow.keras import layers
from tensorflow.keras.models import Sequential

num_classes = 5

model = Sequential([
    layers.experimental.preprocessing.Rescaling(1.0/255,
                                                input_shape=(256, 256, 3)),
    layers.Conv2D(16, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Conv2D(32, 3, padding='same', activation='relu'),
    layers.MaxPooling2D(),
    layers.Flatten(),
    layers.Dense(64, activation='relu'),
    layers.Dense(num_classes)])

model\
    .compile(optimizer='adam', metrics=['accuracy'],
             loss=keras.losses.SparseCategoricalCrossentropy(from_logits=True))

hist = model.fit(tds, validation_data=vds, epochs=15)

如何在sklearn.model_selection 中使用KFoldStratifiedKFold 实现交叉验证?如果为了能够做到这一点,我必须改变数据的加载方式,我也很高兴知道如何去做。

【问题讨论】:

【参考方案1】:

看看这些在 Keras 中实施交叉验证的建议:

Cross Validation in Keras

https://machinelearningmastery.com/evaluate-performance-deep-learning-models-keras/

使用 image_dataset_from_directory 加载数据将生成一个 tf.data.dataset 对象,我不确定它是否有助于上述实现。一种替代方法是将图像转换为 Numpy 数组,然后可以通过 K-fold 处理。为此,您可以参考以下内容:

How to convert a folder of images into X and Y batches with Keras?

注意:上面给出的机器学习精通链接中提到了以下语句:

交叉验证通常不用于评估深度学习模型,因为计算成本更高。例如,k 折交叉验证通常与 5 或 10 折一起使用。因此,必须构建和评估 5 或 10 个模型,大大增加了模型的评估时间。

【讨论】:

我已经阅读了其中的一些链接,但老实说它们对我没有帮助。我设法创建了折叠,但它需要重构代码以加载数据。无论如何,感谢您的帮助。

以上是关于如何对目录中的 keras 图像数据集使用交叉验证?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 GridSearchCV 的 keras 模型的超参数优化中使用简单的验证集?

Keras训练神经网络进行分类并进行交叉验证(Cross Validation)

如何在 keras 分类器中使用交叉验证

R语言使用caret包中的createFolds函数对机器学习数据集进行交叉验证抽样返回的样本列表长度为k个

Keras中验证集的不同损失函数

用于二进制分类的 ResNet - 只有 2 个交叉验证准确度值