【问题标题】:CNN for short text classification perform bad in validation set用于短文本分类的 CNN 在验证集中表现不佳
【发布时间】:2025-12-13 08:30:01
【问题描述】:

我正在使用 CNN 进行短文本分类(对产品标题进行分类)。 代码来自 http://www.wildml.com/2015/12/implementing-a-cnn-for-text-classification-in-tensorflow/

在训练集、测试集、验证集的准确率是打击:

和损失不同。验证的损失是训练集和测试集损失的两倍。(我不能上传超过2张图片。抱歉!)

训练集和测试集来自网络爬虫,然后按7:3拆分。验证来自真实应用消息,并通过人工标记。

我几乎尝试了所有超参数。

我尝试过上采样、下采样、无采样。

批量大小为 1024、2048、5096

dropout 为 0.3、0.5、0.7

embedding_size 为 30、50、75

但这些都不起作用!

现在我使用下面的参数:

批量大小为 2048。

embedding_size 为 30。

sentence_length 为 15

filter_size 是 3,4,5

dropout_prob 为 0.5

l2_lambda 为 0.005

起初我认为它是过度拟合。但是模型在测试集和训练集中表现良好。所以我很困惑!

是不是测试集和训练集的分布差别很大?

如何提高验证集的性能?

【问题讨论】:

  • 您确定您在该图中的痕迹标记正确吗?您的测试准确性最高,这似乎很奇怪。几乎肯定不对?
  • @chris_anderson 谢谢!我确定该图中的跟踪标记正确。我不知道为什么,验证准确度太低
  • 你能重现原教程的准确性吗?该模型的预期验证准确度是多少?
  • @YaoZhang 谢谢!预期的验证准确度至少为 92%,就像图中的开发准确度一样。并在几个小时后训练,验证损失是训练损失的 6 倍。我的验证集有问题吗?

标签: machine-learning tensorflow deep-learning


【解决方案1】:

我认为这种损失差异来自于验证数据集是从与训练/测试集不同的域收集的事实:

训练集和测试集通过爬虫从网络中获取,然后拆分 7:3。验证来自真实的应用程序消息,并通过手动>标记标记

该模型在训练期间没有看到任何真实的应用消息数据,因此它在验证集上未能提供良好的结果也就不足为奇了。传统上,所有三个集合都是从同一个数据池生成的(例如,7-1-2 拆分)。验证集用于超参数调整(batch_size、embedding_length 等),而测试集则用于客观衡量模型性能。

如果您最终关心的是应用数据的性能,我会将该数据集拆分为 7-1-2(训练-验证-测试)并使用网络爬虫数据扩充训练数据。

【讨论】:

    【解决方案2】:

    我认为验证集的损失很高,因为验证数据来自真实的应用消息数据,这可能比您从可能包含噪声的网络爬虫获得的训练数据更真实。如果比推荐的大很多,你的学习率和批量大小都会非常高。你可以试试[0.1, 0.01, 0.001 and 0.0001]的学习率,[32, 64]的batch size,其他的超参数值好像还可以。

    我想对训练、验证和测试集发表评论。训练数据分为训练集和验证集进行训练,而测试集是我们不接触的数据,最终仅用于测试我们的模型。我认为您的验证集是“测试集”,您的测试集是“验证集”。我就是这样称呼他们的。

    【讨论】: