【问题标题】:CNN overfitting on validation set increase test set performance验证集上的 CNN 过拟合提高了测试集的性能
【发布时间】:2019-10-03 17:42:33
【问题描述】:

我实际上是在使用 CNN 对图像进行分类。我有 16 个类和大约 3000 个图像(非常小的数据集)。这是一个不平衡的数据集。我进行了 60/20/20 的拆分,所有课程中每个班级的百分比相同。我使用权重正则化。我使用数据增强(keras augmenteur、SMOTE、ADSYN)进行了测试,这有助于防止过度拟合

当我过拟合(epoch=350loss=2)时,我的模型的准确度(70+%)(以及 F1 分数等其他指标)比我没有过拟合时(epoch=50loss=1)准确度更高约为 60%。当损失为验证集损失时,准确度适用于测试集。

使用过拟合模型作为最佳模型真的是一件坏事吗?既然在测试集上表现更好?

我已经用另一个测试集(之前在训练集上)运行了相同的模型,性能仍然更好(尝试了 3 种不同的拆分)

编辑:关于我所阅读的内容,验证损失并不总是确认模型过度拟合的最佳指标。在我的情况下,最好使用验证 F1 分数和召回率,当它开始下降时,模型可能会过度拟合。 我仍然不明白为什么验证损失是模型评估的一个坏指标,模型仍然使用训练损失来学习

【问题讨论】:

  • 你如何断定你的模型已经“过度拟合”了?
  • 我认为当验证损失增加模型过度拟合时.. 大多数教程都这么说。但它看起来比这更复杂。当验证损失增加时,我实际上在验证和测试集上具有相似(良好)的性能。看起来这不是一个很好的指标来判断模型是否在我的情况下过度拟合,对吗?

标签: python image machine-learning keras conv-neural-network


【解决方案1】:

是的,使用过拟合模型作为最佳模型是一件坏事。根据定义,过度拟合的模型在现实世界场景中表现不佳,即在不在训练或测试集中的图像上。

为避免过度拟合,请使用图像增强来平衡和增加要训练的样本数量。还要尝试增加 dropout 的比例以避免过度拟合。我个人使用 Keras 的 ImageGenerator 来增强图像并保存它。

from keras.preprocessing.image import ImageDataGenerator,img_to_array, load_img
import glob
import numpy as np

#There are other parameters too. Check the link given at the end of the answer
datagen = ImageDataGenerator(
        brightness_range = (0.4, 0.6),
        horizontal_flip = True,
        fill_mode='nearest'
        )

for i, image_path in enumerate(glob.glob(path_to_images)):
    img = load_img(image_path)

    x = img_to_array(img)  # creating a Numpy array

    x = x.reshape((1,) + x.shape)

    i = 0
    num_of_samples_per_image_augmentation = 8

    for batch in datagen.flow(x, save_to_dir='augmented-images/preview/fist', save_prefix='fist', save_format='jpg'):
        i += 1
        if i > num_of_samples_per_image_augmentation : # 
            break

这里是使用 Keras 的图像增强参数的链接,https://keras.io/preprocessing/image/

请随意使用您喜欢的其他库。

很少有其他方法可以减少过拟合:

1) 通过添加更多训练参数来调整您的 CNN 模型。

2) 减少全连接层。

3) 使用迁移学习(预训练模型)

【讨论】:

  • 我已经在进行数据增强(使用 keras augmenteur、SMOTE 和/或 ADASYN),我尝试过下采样、上采样...:/ 我不知道还能尝试什么,我可以调整我的超参数稍微好一点,但我已经找到了一个相对较好的,我不会赢得超过百分之几
  • 当你说添加更多训练参数时,它的意思是增加隐藏层的大小/数量吗?
  • 是的。你试过迁移学习吗?当数据较少时,这是最优选的方法。
  • 这是一个特定的图像分类任务,不是真正的模型谁做这种事情。但是上周发表的一篇文章用 googleNet 这样的经典 DNN 实现了很好的准确性,我可能很快就会尝试这个,值得一试。顺便说一句,感谢您的时间
  • 如果有多个类,使用分类交叉熵作为损失函数。
猜你喜欢
  • 1970-01-01
  • 2021-05-23
  • 1970-01-01
  • 2019-12-26
  • 1970-01-01
  • 2019-08-11
  • 2023-03-23
  • 2012-06-17
  • 1970-01-01
相关资源
最近更新 更多