测试集(验证集)准确率比训练集准确率还要高

ChongTuWang
• 阅读 1757

1.问题

问题描述:在进行神经网络训练时,发现验证集的准确率比训练集还要高,觉得太不正常了,不知道问题出在哪里。我们训练模型的方式就是在训练集上最小化损失。因此,模型在训练集上有着更好的表现,才应该是正常的现象。因为原来训练的时候验证集的准确率都比训练集准确率低很多,这一下反过来,觉得有点蒙。

2.原因

在查找资料后,网络上普遍给出以下几种原因:
2.1模型正则化过多
比如训练时Dropout过多,和验证时的模型相差较大,验证时是不会有Dropout的。Dropout能基本上确保测试集的准确性最好,优于训练集的准确性。Dropout迫使神经网络成为一个非常大的弱分类器集合,这就意味着,一个单独的分类器没有太高的分类准确性,只有当把他们串在一起的时候他们才会变得更强大。而且在训练期间,Dropout将这些分类器的随机集合切掉,因此,训练准确率将受到影响;在测试期间,Dropout将自动关闭,并允许使用神经网络中的所有弱分类器,因此,测试精度提高。
我只用了一次Dropout,去掉之后效果不明显。
2.2欠拟合
前几次一直在欠拟合,随着训练周期的增加,在训练集上的准确率又超过了测试集上的。
本来只训练了5轮,于是将epochs设置为20,发现后面轮次测试集准确率低于训练集,略低于。

Epoch 1/20
179/179 [==============================] - 6s 23ms/step - loss: 3.2855 - accuracy: 0.1603 - val_loss: 2.0219 - val_accuracy: 0.4047
Epoch 2/20
179/179 [==============================] - 4s 21ms/step - loss: 0.8360 - accuracy: 0.8041 - val_loss: 0.2702 - val_accuracy: 0.9605
Epoch 3/20
179/179 [==============================] - 4s 21ms/step - loss: 0.1305 - accuracy: 0.9837 - val_loss: 0.0828 - val_accuracy: 0.9930
Epoch 4/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0499 - accuracy: 0.9948 - val_loss: 0.0498 - val_accuracy: 0.9943
Epoch 5/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0360 - accuracy: 0.9959 - val_loss: 0.0350 - val_accuracy: 0.9953
Epoch 6/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0227 - accuracy: 0.9970 - val_loss: 0.0289 - val_accuracy: 0.9959
Epoch 7/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0189 - accuracy: 0.9976 - val_loss: 0.0267 - val_accuracy: 0.9965
Epoch 8/20
179/179 [==============================] - 4s 22ms/step - loss: 0.0159 - accuracy: 0.9972 - val_loss: 0.0293 - val_accuracy: 0.9943
Epoch 9/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0144 - accuracy: 0.9979 - val_loss: 0.0185 - val_accuracy: 0.9969
Epoch 10/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0118 - accuracy: 0.9977 - val_loss: 0.0221 - val_accuracy: 0.9963
Epoch 11/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0115 - accuracy: 0.9977 - val_loss: 0.0182 - val_accuracy: 0.9967
Epoch 12/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0130 - accuracy: 0.9978 - val_loss: 0.0268 - val_accuracy: 0.9937
Epoch 13/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0546 - accuracy: 0.9881 - val_loss: 0.0627 - val_accuracy: 0.9859
Epoch 14/20
179/179 [==============================] - 4s 22ms/step - loss: 0.0217 - accuracy: 0.9952 - val_loss: 0.0268 - val_accuracy: 0.9943
Epoch 15/20
179/179 [==============================] - 4s 22ms/step - loss: 0.0095 - accuracy: 0.9981 - val_loss: 0.0153 - val_accuracy: 0.9975
Epoch 16/20
179/179 [==============================] - 4s 22ms/step - loss: 0.0095 - accuracy: 0.9982 - val_loss: 0.0167 - val_accuracy: 0.9969
Epoch 17/20
179/179 [==============================] - 4s 21ms/step - loss: 0.0082 - accuracy: 0.9984 - val_loss: 0.0142 - val_accuracy: 0.9969
Epoch 18/20
179/179 [==============================] - 4s 22ms/step - loss: 0.0075 - accuracy: 0.9986 - val_loss: 0.0134 - val_accuracy: 0.9975
Epoch 19/20
179/179 [==============================] - 4s 22ms/step - loss: 0.0093 - accuracy: 0.9982 - val_loss: 0.0140 - val_accuracy: 0.9971
Epoch 20/20
179/179 [==============================] - 4s 23ms/step - loss: 0.0200 - accuracy: 0.9950 - val_loss: 0.0255 - val_accuracy: 0.9945

2.3数据集太小
这样会导致数据集切分的时候不均匀,也就是说训练集和测试集的分布不均匀,如果模型能够正确地捕捉到数据内部的分布模式的话,就有可能造成训练集的内部方差大于验证集,会造成训练集的误差更大,这个时候就需要重新划分数据集,使其分布一样。
2.4小批量统计的滞后性
训练集的准确率是每个batch之后产生的,而验证集的准确率一般是一个epoch后产生的,验证时的模型是训练一个个batch之后的,有一个滞后性,可以说就是用训练得差不多的模型用来验证,当然准确率要高一点。(这个解释我没有get到,因为batch之后的准确率在不断变化,最终取得是最后一次batch的准确率,与一个epoch应该是一致的
2.5数据预处理
训练集的数据做了一系列的预处理,如旋转、仿射、模糊、添加噪点等操作,过多的预处理导致训练集的分布产生了变化,所以使得训练集的准确率低于验证集

参考文献:
[1]模型训练时测试集上正确率大于训练集
[2]【深度学习】2-模型在测试集的准确率大于训练集

点赞
收藏
评论区
推荐文章
什么是fine-tuning?
什么是finetuning?在实践中,由于数据集不够大,很少有人从头开始训练网络。常见的做法是使用预训练的网络(例如在ImageNet上训练的分类1000类的网络)来重新finetuning(也叫微调),或者当做特征提取器。以下是常见的两类迁移学习场景:1卷积网络当做特征提取器。使用在ImageNet上预训练的网络,去掉最后的全连接层,剩余
Stella981 Stella981
3年前
Python实现bp神经网络识别MNIST数据集
前言训练时读入的是.mat格式的训练集,测试正确率时用的是png格式的图片代码!/usr/bin/envpython3codingutf8importmathimportsysimportosimportnumpyasnpfromPIL
Stella981 Stella981
3年前
Python之TensorFlow的(案例)验证码识别
  一、这里的案例相对比较简单,主要就是通过学习验证码的识别来认识深度学习中我们一般在工作中,需要处理的东西会存在哪些东西。  二、因为我没有数据集,没有关系,这里自己写了一个数据集,来做测试,为了方便我把这个数据集,写成了\.tfrecords格式的文件。  三、生成数据集  1)生成验证码图片生成验证码训练集
数据堂 数据堂
1年前
大模型数据集:构建、挑战与未来发展
一、引言随着深度学习技术的迅速发展,大型预训练模型如GPT4、BERT等在自然语言处理领域取得了显著的成果。这些大模型的表现得益于其背后庞大的数据集,这些数据集为模型提供了丰富的知识和信息。本文将探讨大模型数据集的构建、面临的挑战以及未来的发展趋势。二、大
数据堂 数据堂
1年前
大模型数据集:探索新维度,引领AI变革
一、引言在人工智能(AI)的快速发展中,大型预训练模型如GPT、BERT等已经取得了令人瞩目的成果。这些大模型的背后,离不开规模庞大、质量优良的数据集的支撑。本文将从不同的角度来探讨大模型数据集的新维度,以及它们如何引领AI的变革。二、大模型数据集的新维度
数据堂 数据堂
1年前
语音数据集:AI语音技术的基石
一、引言在人工智能领域,语音技术正逐渐成为研究的热点之一。语音数据集作为AI语音技术的基石,对于模型的训练和应用至关重要。本文将深入探讨语音数据集的重要性、构建方法、挑战以及未来的发展趋势。二、语音数据集的重要性语音识别:语音数据集是实现语音识别的关键。通
高耸入云 高耸入云
1年前
如何做Bert模型的fine-tuning?近屿智能OJAC带你一探究竟
📖更多AI资讯请👉🏾选择合适的预训练模型:从预训练的BERT模型开始,例如Google提供的BERTbase或BERTlarge。这些模型已经在大量文本数据上进行过预训练了,我们如何对BERT模型进行finetuning呢?准备和预处理数据:集针对特
数据堂 数据堂
1个月前
数据上新 | 全新高质量训练数据集重磅发布
数据堂全新发布多语种大模型预训练数据集、多模态大模型数据集、语音识别与计算机视觉训练数据集,全面助力企业打造更高精度、更强泛化能力的AI模型,轻松应对全球用户多样化的语言与应用场景需求,为智能升级提供坚实数据支撑。
数据堂 数据堂
1年前
大模型数据集:构建、挑战与未来趋势
一、引言随着深度学习技术的快速发展,大型预训练模型如GPT4、BERT等在各个领域取得了显著的成功。这些大模型背后的关键之一是庞大的数据集,为模型提供了丰富的知识和信息。本文将探讨大模型数据集的构建、面临的挑战以及未来发展趋势。二、大模型数据集的构建收集数
数据堂 数据堂
1年前
大模型数据集:突破边界,探索未来
一、引言随着人工智能技术的快速发展,大型预训练模型如GPT4、BERT等在自然语言处理领域取得了显著的成功。这些大模型背后的关键之一是庞大的数据集,为模型提供了丰富的知识和信息。本文将探讨大模型数据集的突破边界以及未来发展趋势。二、大模型数据集的突破边界数