我实际上是在使用CNN对图像进行分类。我有16个课程和大约3000张图像(非常小的数据集)。这是不平衡数据集。我进行60/20/20分割,所有组中每个班级的百分比相同。我使用权重正则化。我对数据增强(keras增强器,SMOTE,ADSYN)进行了测试,这有助于防止过拟合
当我过度拟合(epoch=350
,loss=2
时,我的模型比未过度拟合(epoch=50
时,其准确性(70%以上)和其他指标(例如F1得分)更高,loss=1
)的准确性约为60%。当损失是验证集损失时,TEST设置的准确性。
使用过度拟合的模型作为最佳模型真的不好吗?因为测试集的性能更好?
我使用相同的模型运行了另一个测试集(之前在火车上进行过测试),性能仍然更好(尝试了3个不同的分组)
编辑:关于我所读的内容,验证损失并非总是确定模型过度拟合的最佳指标。在我的情况下,最好使用验证F1得分并回想一下,当它开始下降时,则模型可能过度拟合。 我仍然不明白为什么验证损失对模型评估来说是不好的指标,模型仍然使用训练损失来学习
答案 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)使用迁移学习(预先训练的模型)