使用tf.keras构建RNN文本生成模型时准确率异常偏高的问题排查
问题诊断与修复建议
1. 输入输出序列长度不匹配的逻辑错误
你的模型输出形状为(None, 149, 1712),但目标序列Y的形状是(113, 148, 1712),两者时间步长度不一致:
- 模型接收149步的输入,返回149步的输出;
- 目标Y是输入右移一位后的结果,长度为148步。
这种不匹配会导致训练逻辑混乱:要么TensorFlow自动截断模型输出的最后一步强行匹配Y,要么数据准备阶段的序列对齐完全错误。正确的文本生成训练逻辑应该是:
- 输入序列X取原文本的前T-1步(148步),形状
(113,148,1712); - 目标序列Y取原文本的后T-1步(148步),形状
(113,148,1712); - 模型输入输出均为148步,确保每个输入时间步t对应目标时间步t的下一个token。
2. 样本量过小引发的极端过拟合
训练数据仅113条文本,总token数不足1.7万,但模型参数多达26万,远超过训练数据的信息量。首轮训练准确率就达到0.99,本质是模型直接“记住”了所有训练样本的每个位置的token,而非学习到文本的语义或语法规律。这类模型在新数据上的表现会极差,完全不具备文本生成能力。
3. 模型结构与训练目标的适配问题
文本生成任务中,one-hot编码输入通常需要配合**教师强制(Teacher Forcing)**训练,但你的代码未体现相关配置。另外,LSTM隐藏层维度仅为30,对于1712的词汇表来说容量不足,但样本量过小反而掩盖了这个问题,让模型直接记忆数据而非学习规律。
修复步骤
- 修正序列对齐:调整
DataPrepare函数,让输入X和目标Y的时间步长度一致(均为148步),手动验证几条样本的X与Y是否为连续的前后token关系; - 扩充训练数据:尽可能增加训练文本数量(至少数千条),让模型能学习到通用的文本规律;
- 抑制过拟合:加入
tf.keras.layers.Dropout(0.2)层,使用更小的学习率(如1e-4),或改用Embedding层替代one-hot编码,降低输入维度; - 调整模型结构:可适当增大LSTM隐藏层维度(如64或128),提升模型的特征学习能力。
内容的提问来源于stack exchange,提问作者Brad Brad
相关产品推荐
相关产品推荐

