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

在LSTM最后一层使用sigmoid激活函数时出现维度不匹配错误

解决LSTM模型中logits与labels形状不匹配的问题

错误原因

你遇到的ValueError: logits and labels must have the same shape问题,核心是模型输出形状和标签形状不匹配:

  • 第二个LSTM层设置了return_sequences=True,导致该层输出为三维张量 (None, 60, 30)(None代表批量大小,60是时间步长,30是LSTM单元数)
  • 后续Dense层会对每个时间步单独计算输出,最终模型输出为(None, 60, 1)
  • 而你的标签Y_train['TARGET_ENTRY_LONG']是一维张量(None,),两者维度不匹配触发报错

当你去掉sigmoid激活时没有报错,但这不符合二分类逻辑——此时模型输出的是原始logits,而binary_crossentropy默认期望输入是经过sigmoid归一化后的概率值(或需显式设置from_logits=True),所以训练结果会偏离预期。

解决方案

修改第二个LSTM层的return_sequences参数为False(或直接删除该参数,默认值即为False),让LSTM层只输出最后一个时间步的结果,这样后续Dense层的输出形状就能和标签匹配:

修改后的模型代码

# define model
model = Sequential()
model.add(LSTM(90, activation='relu', input_shape=(length, n_features), return_sequences=True, dropout = 0.3))
# 移除return_sequences=True,使用默认的False
model.add(LSTM(30, activation='relu', dropout = 0.3))
model.add(Dense(1, activation = 'sigmoid'))
model.compile(optimizer='adam', loss='binary_crossentropy')

补充说明

如果你的任务是序列标注(需要对每个时间步输出预测),则需要将标签形状调整为(None, 60, 1),但从标签列名TARGET_ENTRY_LONG判断,你应该是做单步二分类预测(预测序列结束后的结果),因此上述修改完全适用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.12 16:45:32