keras训练模型,训练集的准确率很高,但是测试集准确率很低的原因

今天在测试模型时发现一个问题,keras训练模型,训练集准确率很高,测试集准确率很低,因此记录一下希望能帮助大家也避坑:

首先keras本身不同的版本都有些不同的或大或小的bug,包括之前也困扰过我的BN层问题(相信很多人都中过招),因此我先说下我的对应版本:keras:2.3.1 tensorflow-gpu:1.15 CUDA:10.0 cudnn:7.6.3

在训练模型完成后在测试集测试模型准确率:

def valid_data(valid_data_dir='./data/val'):
    valid_datagen = ImageDataGenerator(rescale=1. / 255)
                                       
    valid_generator = valid_datagen.flow_from_directory(valid_data_dir,
                                                        target_size=(224, 224),
                                                        batch_size=16,
                                                        class_mode='categorical',
                                                        )
    return valid_generator

valid_generator = valid_data()

model = load_model('resnet.h5')
predictions = model.predict_generator(valid_generator,verbose=1)
predict_label = predictions.argmax(axis=-1) 
true_label = valid_generator.classes

acc=accuracy_score(true_label,predict_label)
print(acc, end='\n\n')

乍一看代码其实没有太大问题,但是最后准确率很低:
在这里插入图片描述

核心原因是对测试集的数据顺序做了打乱,使得预测label与真实label无法对应:
在这里插入图片描述
预测label是对打乱的数据预测的:

在这里插入图片描述

但是真实label是未打乱的:
在这里插入图片描述

解决的办法是对代码进行修改:shuffle=False
在这里插入图片描述
修改后的模型测试准确率就正常了:

在这里插入图片描述
当然,导致模型测试集准确率低的原因远不止这一种,还有很多其他的可能,所以希望大家在遇见具体问题的时候还是能够具体分析。

在使用Keras训练模型时,如果测试集准确率始终不变,可能有以下几个原因: 1. 模型设计问题:模型可能存在欠拟合或过拟合的情况。欠拟合指模型过于简单,无法充分拟合训练数据,导致在测试集准确率不变;过拟合则是模型过于复杂,过度拟合了训练数据,对于新样本的预测能力较差。通过调整模型的结构、参数和超参数,可以解决这些问题。 2. 数据问题:测试集的数据可能与训练集的数据分布不一致,导致模型在测试集上的表现不佳。这可能是由于训练集测试集之间的数据划分不合理,应该重新划分数据集。 3. 训练过程问题:训练的迭代轮数可能不足,或者学习率设置不合适。增加训练轮数或适当调整学习率,可能会改善模型在测试集上的效果。 4. 数据预处理问题:在使用Keras前,对数据进行的预处理操作可能不合理。预处理的方式可能导致模型在训练和测试集上的输入数据不一致,从而影响准确率。应该检查数据预处理的流程和参数设置是否正确。 5. 随机性问题:训练和测试数据的随机划分可能导致偶然的结果。可以通过多次随机划分数据集并进行实验来验证模型的性能稳定性。 综上所述,当Keras训练时,测试集准确率不变可能是由于模型设计问题、数据问题、训练过程问题、数据预处理问题或随机性问题导致的。在解决这些问题时,可以逐个排除,逐步调整和优化模型,以提测试集准确率
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值