时序预测编码器-解码器模型推理阶段TypeError报错排查求助
问题排查与修复
核心错误原因
你在推理时传入的enc_states是模型定义阶段的符号KerasTensor,不是经过编码器计算得到的实际数值状态。符号张量的形状中包含None(代表批量维度),无法直接作为推理模型的输入,导致int()转换None的类型错误。
修复步骤
1. 新增编码器状态提取模型
在原模型代码末尾,添加单独的编码器模型,用于从真实输入计算出实际的LSTM状态值:
# 构建编码器模型,输入编码器数据,输出LSTM的h和c状态 encoder_model = keras.models.Model(encoder_inputs, enc_states)
2. 修正推理代码逻辑
先通过编码器模型计算验证集对应的真实状态,再传入推理模型:
# 第一步:用验证集的编码器输入计算实际状态(得到两个numpy数组) real_enc_states = encoder_model.predict(val_x[0]) # 第二步:将解码器输入和真实状态传入推理模型 predictions = inf_model.predict([val_x[1]] + list(real_enc_states))
额外优化建议
- 针对TensorFlow的格式警告:可以将训练数据转换为
tf.data.Dataset格式提升性能,示例代码:
import tensorflow as tf # 假设train_enc是编码器训练数据,train_dec是解码器训练数据,train_y是标签 train_dataset = tf.data.Dataset.from_tensor_slices(([train_enc, train_dec], train_y)).batch(32) model.fit(train_dataset, epochs=10)
- 输入形状校验:确保推理时
val_x[1]的形状(14284,24,6)与模型定义的decoder_inputs形状(n_past, n_feat2)完全匹配(即n_past=24,n_feat2=6)。
内容的提问来源于stack exchange,提问作者Art
相关产品推荐
相关产品推荐

