LSTM情感分析训练报Shapes(32,1)与(32,2)不兼容错误如何解决
问题根因
报错Shapes (32, 1) and (32, 2) are incompatible的本质是模型输出维度、标签维度、损失函数三者配置不匹配:
- 你通过label encoding得到的情感标签是形状为
(样本数,)的一维数组,每个值为0或1,单样本标签对应维度是1 - 模型最后一层Dense设置了2个输出单元,单样本输出维度是2
- 维度完全对不上,计算损失时直接触发形状不兼容错误,同时你当前选的损失函数和输出层配置本身也存在搭配错误。
修复方案
二选一即可,优先选第一种,更适配你的二分类情感分析场景。
方案1:单输出二分类配置(推荐)
这是二分类任务的标准写法,不需要额外修改标签,只需调整模型输出层即可:
- 将最后一层Dense的输出单元数从2改为1,激活函数保留
sigmoid,输出值为0-1之间的单值,代表样本属于正向情感的概率 - 损失函数保留
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:双输出多分类配置
如果你希望模型同时输出两个情感类别的概率,需要同步调整标签和损失函数:
- 先将一维的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)
- 将最后一层Dense的激活函数从
sigmoid改为softmax,保证两个类别输出概率和为1 - 将损失函数从
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
相关产品推荐
相关产品推荐

