如何从CNN文本分类模型获取预测标签?模型仅返回0该如何解决
问题原因与解决方案
一、直接错误:预测标签的处理逻辑错误
你当前的输出层是Dense(1, activation='sigmoid'),对应二分类sigmoid输出的是单个0~1之间的概率值,不是2维的one-hot概率分布,所以np.argmax(y_sample)属于误用:
- 对于只有1个元素的数组,
np.argmax永远返回索引0,这是你所有输出都是0的直接原因。
正确的预测标签获取逻辑应该是设置阈值(通常用0.5)判断,替换对应代码即可:
X_sample = tokenizer.texts_to_sequences(df['stemmed']) X_sample = pad_sequences(X_sample, maxlen=maxlentweet) y_sample = model.predict(X_sample).flatten().tolist() # 原错误代码删除,替换为以下逻辑:概率大于等于0.5判定为类别1,否则为类别0 result = [1 if prob >= 0.5 else 0 for prob in y_sample] # 如果是单样本预测,直接用: # result = 1 if y_sample[0] >= 0.5 else 0 print(result)
二、修正预测逻辑后仍全输出0的排查方向
- 检查训练集标签分布:如果类别0占比极高(比如90%以上),模型会直接全部预测0来获得高准确率,此时需要做样本均衡处理,比如对类别1过采样、类别0欠采样,或者训练时传入类别权重:
# 示例,可根据实际标签占比调整权重 class_weight = {0: 1, 1: 5} model.fit(X_train, y_train, class_weight=class_weight, 其余参数保持不变) - Dropout比率设置过高:两个Dropout层都用了0.7,极易导致模型欠拟合,建议先降到0.2~0.3区间再逐步调整。
- 确认训练是否充分:查看训练过程中损失和准确率的变化,如果损失没有收敛,适当增加训练轮次。
内容的提问来源于stack exchange,提问作者fathimah
相关产品推荐
相关产品推荐

