训练集验证集很高(>95%),但测试集始终低于5%

最终找到的Bug来源与解决方案:

Bug:

训练集和测试集上的准确率都很高,但是测试集始终低于5%,稳定地低于5%。

来源:

数据集文件夹命名问题导致ImageFolder加载的数据集的class_to_idx错误,因此每次输出的类别都是错的。

解决方案:

原数据集中的文件夹命名形式为:0、1、2、3......8、9、10......42

将数据集的文件夹名称改为00、01、02、03......08、09、10......42即可解决标签错乱问题;

修改前:
在这里插入图片描述
修改后:
在这里插入图片描述

如何发现Bug的:

可能的原因排查:

首先确保相关流程的代码没有写错,再从每个部分分别进行排查:
根据训练模型的流程,对以下几个部分依次进行排查;

  1. 训练全连接层 -> 2. 微调卷积层 -> 3. 测试集测试
  • 数据集加载(datasets,数据集加载可能有问题,如乱序)
  • 数据加载进模型进行训练(dataloader,输入进分类器的组织形式是否有问题,如乱序)
  • 预训练模型加载(train_fc,训练代码是否有问题)
  • 训练好的模型保存(torch.save,模型保存是否正常,单/多卡保存存在差异)
  • 加载重新训练全连接层的模型(fine_tuning,加载模型是否正常,微调代码是否正常)
  • 训练好的模型保存(torch.save,模型保存是否正常,单/多卡保存存在差异)
  • 加载训练好的模型进行测试(test,加载模型是否正常,计算准确率是否正确)

观察输出结果:

中途确实遇到了加载模型失败的情况,原因是单双卡保存的模型不一样,加载也存在些许差异,但这很容易解决,不是问题重点。
星期四的早上我突然发现,测试集输出的标签虽然是错的,但是错的很一致呀,2一直被输出为10,3一直被输出为11?训练了这么多次,每次都错的一样这难免让我很好奇。
于是我收集了输出结果的键值对,​强行用键值对改变输出标签后,测试集准确率直接飙升至95+%;
这时候就可以锁定问题了,就是加载数据时文件与标签对应错误了,那到底是哪里对应错误了呢?
我使用datasets中的ImageFolder加载的数据集,文件组织形式是按照推荐的形式的标准数据集;随后用dataloader将数据分块进行加载,我检查了好多遍代码也发现Bug,一点头绪也没有;
然后我就想着对datasets加载的图片进行可视化,发现确实的标签和图像文件没有对应上,随后进行debug,发现ImageFolder返回的对象中包含一个属性叫:classes_to_idx,里面的类别和标签没对应上。
可以看到class_to_idx是无法正确对应上的;

突然猛地想起我在某个地方看到的文件夹命名为000、001、002的样式,于是我尝试着对应地进行修改,好了,就这样解决了???
改成00,01,02,03,04文件夹命名时:

  • 5
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
这种情况通常被称为过拟合,即模型在训练集验证集上表现良好,但在测试集上表现不佳。过拟合的原因可能是以下几个方面: 1.训练数据太少,模型无法学习到足够的特征,从而在测试集上表现不佳。 2.模型太复杂,导致在训练集上过度拟合,无法泛化到测试集。 3.数据集存在噪声或异常值,导致模型在训练集上过度拟合,无法泛化到测试集。 针对这种情况,可以采取以下措施: 1.增加训练数据量,从而使模型能够学习到更多的特征。 2.减少模型的复杂度,可以通过减少网络层数、减少神经元数量等方式实现。 3.对数据进行清洗和预处理,去除噪声和异常值。 4.使用正则化技术,如L1、L2正则化等,限制模型的复杂度,防止过拟合。 5.使用dropout技术,随机丢弃一部分神经元,防止模型过度拟合。 6.使用预训练的权重,可以提模型的泛化能力。 7.检查网络结构是否存在问题,如梯度消失、梯度爆炸等问题。 ```python # 代码示例:使用dropout技术防止过拟合 from keras.models import Sequential from keras.layers import Dense, Dropout model = Sequential() model.add(Dense(64, activation='relu', input_dim=100)) model.add(Dropout(0.5)) model.add(Dense(64, activation='relu')) model.add(Dropout(0.5)) model.add(Dense(1, activation='sigmoid')) model.compile(optimizer='rmsprop', loss='binary_crossentropy', metrics=['accuracy']) model.fit(x_train, y_train, epochs=20, batch_size=128, validation_data=(x_val, y_val)) ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值