在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
相关产品推荐
相关产品推荐

