TensorFlow 2.0 LSTM模型Anaconda环境报错,Colab运行正常求助
这问题我之前也踩过坑!核心原因是你的目标数据形状和模型输出形状不匹配,Colab能跑大概率是你在那边的y_train维度已经调整过,或者环境里TF的默认行为有细微差异,但本质还是形状对齐的问题。
先拆解报错信息:
ValueError: A target array with shape (260, 1, 5) was passed for an output of shape (1, 5) while using as loss mean_squared_error . This loss expects targets to have the same shape as the output.
你的模型定义里,batch_input_shape=(1,10,5)且stateful=True,所以每个batch的输入是(1,10,5),经过LSTM和Dense层后,模型的输出形状是(1,5)。但你的y_train_data是(260,1,5)——多了一个不必要的中间维度,导致每个batch的目标形状变成(1,1,5),和模型输出的(1,5)完全对不上,自然触发损失函数的形状校验错误。
直接解决方案:调整目标数据的形状
用reshape去掉y_train里多余的中间维度就行:
y_train = y_train_data.reshape((260, 5))
调整后y_train的形状变成(260,5),和模型每个batch输出的(1,5)就能完美匹配——fit函数会按batch_size=1逐个取样本,每个样本的目标形状是(5,),对应模型输出的(1,5)(batch维度会自动对齐)。
额外提醒(Stateful LSTM必做)
因为你用了stateful=True,训练完每个epoch后一定要重置模型状态,不然上一个epoch最后一个样本的状态会延续到下一个epoch,导致训练逻辑混乱:
Model_10.fit(x_train, y_train, epochs=1, batch_size=1, verbose=2, shuffle=False, callbacks=[history]) Model_10.reset_states() # 每个epoch结束后必须执行这一步
为什么Colab能正常运行?
大概率是你在Colab环境中,y_train的形状已经是(260,5)(可能预处理时已经调整过),或者你使用的TF版本在形状兼容上更宽松,但Anaconda环境的TF2.0严格执行了形状匹配要求,所以才会报错。
内容的提问来源于stack exchange,提问作者Gnuseek

