LSTM二分类讽刺检测模型出现NaN损失的原因排查
问题分析与解决方案
1. LSTM层参数使用错误(最可能的直接原因)
你的LSTM层写法存在致命问题:
model.add(LSTM(lstm_out1, Dropout(0.2), Dropout(0.2)))
LSTM层的参数中不能直接传入Dropout层实例,这种写法会破坏模型的计算逻辑,直接导致输出NaN。正确的实现方式有两种:
修正方式一:使用LSTM内置的 dropout 参数
model.add(LSTM(lstm_out1, dropout=0.2, recurrent_dropout=0.2))
修正方式二:将Dropout作为独立层添加
model.add(LSTM(lstm_out1)) model.add(Dropout(0.2))
2. 嵌入矩阵embed_matrix存在NaN值
你仅检查了原始文本和标签的缺失值,但未验证预训练嵌入矩阵的合法性。添加以下代码排查:
import numpy as np print(np.isnan(embed_matrix).any())
如果结果为True,说明嵌入矩阵存在无效值,需要重新生成矩阵,或用0、词向量均值填充这些NaN。
3. 输入序列存在非法索引
文本转成的整数序列可能存在超出词汇表范围的数值,导致Embedding层输出异常。检查输入特征的最大值:
print(np.max(X_train)) # X_train为你的输入特征矩阵
若最大值大于vocab_size-1,需重新处理文本序列,确保所有索引都在合法范围内。
4. 数值溢出问题
即便做了梯度裁剪和学习率调整,仍可能因模型结构或数据分布导致数值溢出。可尝试:
- 减小LSTM单元数量(比如将
lstm_out1从128降至64) - 在Dense层后加入BatchNormalization层稳定数值分布:
model.add(Dense(64, activation='relu')) model.add(BatchNormalization())
内容的提问来源于stack exchange,提问作者Debbie
相关产品推荐
相关产品推荐

