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

LSTM情感分析训练报Shapes(32,1)与(32,2)不兼容错误如何解决

问题根因

报错Shapes (32, 1) and (32, 2) are incompatible的本质是模型输出维度、标签维度、损失函数三者配置不匹配:

  • 你通过label encoding得到的情感标签是形状为(样本数,)的一维数组,每个值为0或1,单样本标签对应维度是1
  • 模型最后一层Dense设置了2个输出单元,单样本输出维度是2
  • 维度完全对不上,计算损失时直接触发形状不兼容错误,同时你当前选的损失函数和输出层配置本身也存在搭配错误。
修复方案

二选一即可,优先选第一种,更适配你的二分类情感分析场景。

方案1:单输出二分类配置(推荐)

这是二分类任务的标准写法,不需要额外修改标签,只需调整模型输出层即可:

  1. 将最后一层Dense的输出单元数从2改为1,激活函数保留sigmoid,输出值为0-1之间的单值,代表样本属于正向情感的概率
  2. 损失函数保留binary_crossentropy无需修改
    修改后的完整模型代码:
model = Sequential()
model.add(Embedding(2000, 32, input_length=max_review_length))
model.add(SpatialDropout1D(0.3))
model.add(LSTM(176, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(1, activation='sigmoid'))
model.compile(loss = 'binary_crossentropy', optimizer='adam', metrics = ['accuracy'])
print(model.summary())
model.fit(X_train, y_train, validation_data=(X_test,y_test), epochs=5, batch_size=32)

方案2:双输出多分类配置

如果你希望模型同时输出两个情感类别的概率,需要同步调整标签和损失函数:

  1. 先将一维的0/1标签转为二维one-hot编码,转换后标签形状为(样本数, 2),转换代码:
from tensorflow.keras.utils import to_categorical
y_train = to_categorical(y_train, num_classes=2)
y_test = to_categorical(y_test, num_classes=2)
  1. 将最后一层Dense的激活函数从sigmoid改为softmax,保证两个类别输出概率和为1
  2. 将损失函数从binary_crossentropy替换为categorical_crossentropy,适配one-hot标签+多单元输出的多分类场景
    修改后的核心代码片段:
model = Sequential()
model.add(Embedding(2000, 32, input_length=max_review_length))
model.add(SpatialDropout1D(0.3))
model.add(LSTM(176, dropout=0.2, recurrent_dropout=0.2))
model.add(Dense(2, activation='softmax'))
model.compile(loss = 'categorical_crossentropy', optimizer='adam', metrics = ['accuracy'])

补充:方案1参数量更小,训练效率更高,不需要额外做标签转换,对二分类任务来说效果和方案2没有明显差异,是首选方案。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 12:48:18