You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

情感分类神经网络参数调整后准确率始终不变的问题求助

解决你的短语情感分类模型准确率固定问题

我一眼就看到几个关键问题,咱们一个个来排查修复:

1. 输出层激活函数用错了(最核心的问题)

你在最后一层用了activation='softmax',但这是二分类任务,而且你只设置了1个神经元!

  • 对于单神经元的二分类输出,必须用sigmoid激活函数:sigmoid会输出0到1之间的概率值,配合binary_crossentropy损失函数刚好匹配二分类任务。
  • 而softmax对于单个神经元来说,输出永远是1(因为归一化后只有一个数值),这直接导致模型只能预测某一类,准确率就固定在数据集中该类别的占比(你的0.2057应该就是这个类别在测试集里的比例)。

修改代码:

model.add(Dense(1, activation='sigmoid'))

2. 测试集预处理写错了

看这行代码:

pad_phrases_test = pad_sequences(phrases_valid_tokens, maxlen=maxlen, padding='post')

你把测试集的token序列写成了验证集的phrases_valid_tokens,等于你一直在用验证集数据评估模型,这完全不能反映模型的真实泛化能力,赶紧改成:

pad_phrases_test = pad_sequences(phrases_test_tokens, maxlen=maxlen, padding='post')

3. 数据合并的写法有问题

你用phrases_train.append([phrases_valid, phrases_test], ignore_index = True)来合并数据,如果phrases_train是pandas Series的话,这个写法是错的:

  • pandas的append方法已经被弃用,而且不能直接传列表作为参数。正确的合并方式应该用pd.concat:
import pandas as pd
total_phrases = pd.concat([phrases_train, phrases_valid, phrases_test], ignore_index=True)

如果你的数据是普通Python列表,直接用加法合并就行:

total_phrases = phrases_train + phrases_valid + phrases_test

这个错误会导致tokenizer没有学习到测试集里的词汇,影响模型对测试数据的处理。

额外的优化建议

除了上面的必改项,还有几个点可以帮你提升到期望的50%+准确率:

  • 检查标签分布:看看sents_train里0和1的比例,如果严重不平衡(比如某类占80%以上),模型会偷懒预测多数类,这时候可以在model.fit()里加上class_weight参数,比如class_weight={0: 1, 1: 4}来给少数类更高的权重。
  • 调整模型结构:Embedding层之后直接接Dense层再喂给GRU有点奇怪,你可以试试先加一个GlobalAveragePooling1D()或者直接把Embedding的输出传给GRU,去掉中间的Dense层,看看效果:
model = Sequential()
model.add(Embedding(vocab_size, 100, input_length=maxlen))
model.add(GRU(units=32, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
  • 监控训练过程:训练时看训练集和验证集的loss和accuracy变化,如果验证集accuracy一直不动,可能是过拟合或者欠拟合,调整dropout比例、batch size或者epochs数量。

先把前三个必改项修复,应该就能解决准确率固定的问题,之后再慢慢优化模型到你期望的效果。

内容的提问来源于stack exchange,提问作者Aleksander Chmielewski

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 08:13:02