CNN对验证集的过度拟合可提高测试集的性能

时间:2019-05-16 12:31:55

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

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

当我过度拟合(epoch=350loss=2时,我的模型比未过度拟合(epoch=50时,其准确性(70%以上)和其他指标(例如F1得分)更高,loss=1)的准确性约为60%。当损失是验证集损失时,TEST设置的准确性。

使用过度拟合的模型作为最佳模型真的不好吗?因为测试集的性能更好?

我使用相同的模型运行了另一个测试集(之前在火车上进行过测试),性能仍然更好(尝试了3个不同的分组)

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

1 个答案:

答案 0 :(得分:2)

是的,将拟合模型用作最佳模型是一件坏事。根据定义,过度拟合的模型在实际场景中(例如,不在训练或测试集中的图像上)的效果并不理想。

为避免过度拟合,请使用图像增强来平衡并增加要训练的样本数量。也请尝试增加辍学率,以免过度拟合。我个人使用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)使用迁移学习(预先训练的模型)