基于TensorFlow后端的Keras:多输入并行处理的LSTM-Dense回归预测模型构建
Keras多输入回归模型实现:LSTM处理3D序列+Dense处理特征矩阵
没问题,我帮你一步步搞定这个多输入的回归预测模型,完全适配TensorFlow Keras环境,直接上可运行的代码和关键细节解释:
步骤1:导入必要的依赖库
首先导入Keras的核心模块和层:
import tensorflow as tf from tensorflow.keras.models import Model from tensorflow.keras.layers import Input, LSTM, Dense, Concatenate, Dropout from tensorflow.keras.callbacks import EarlyStopping # 可选,用于早停防止过拟合
步骤2:构建两个输入分支
我们需要分别为3D序列特征X1和关键特征矩阵X2构建独立的处理分支:
分支1:LSTM处理3D序列特征X1
针对形状为(9000, 300, 3)的序列数据,用LSTM提取时序特征:
# 定义X1的输入层,形状是(时间步长, 特征数)=(300,3) input_x1 = Input(shape=(300, 3), name="sequence_input") # LSTM层:64个隐藏单元,仅返回最后一个时间步的输出(回归任务足够) x1 = LSTM(64, return_sequences=False)(input_x1) x1 = Dropout(0.2)(x1) # 加入Dropout抑制过拟合 x1 = Dense(32, activation="relu")(x1) # 进一步压缩特征
分支2:Dense层处理关键特征X2
针对形状为(9000, 106)的结构化特征,用全连接层提取特征:
# 定义X2的输入层,形状是(特征数,)=(106,) input_x2 = Input(shape=(106,), name="dense_input") x2 = Dense(64, activation="relu")(input_x2) x2 = Dropout(0.2)(x2) x2 = Dense(32, activation="relu")(x2)
步骤3:合并分支并构建输出层
将两个分支的特征合并后,接入回归任务的输出层:
# 拼接两个分支的输出特征 combined_features = Concatenate()([x1, x2]) # 回归任务输出层:1个单元,线性激活(默认就是linear,适合回归) output = Dense(1, name="regression_output")(combined_features)
步骤4:定义完整模型并编译
指定模型的输入和输出,然后编译模型(回归任务用MSE损失):
# 构建完整模型 model = Model(inputs=[input_x1, input_x2], outputs=output) # 编译模型:Adam优化器+MSE损失(回归任务标准配置) model.compile( optimizer="adam", loss="mean_squared_error", metrics=["mean_absolute_error"] # 可选,监控MAE指标 ) # 打印模型结构确认(可选) model.summary()
步骤5:按你的计划训练模型
直接用zip(X1, X2)作为输入,和你预想的训练方式一致:
# 设置训练参数 BATCH_SIZE = 32 EPOCHS = 50 # 可选:加入早停回调,防止过拟合 early_stop = EarlyStopping( monitor="val_loss", patience=5, restore_best_weights=True # 恢复最优权重 ) # 开始训练 history = model.fit( zip(X1, X2), y, batch_size=BATCH_SIZE, epochs=EPOCHS, validation_split=0.2, # 用20%数据做验证 callbacks=[early_stop] # 加入早停(可选) )
关键注意事项
- 输入形状校验:确保
X1是(9000, 300, 3),X2是(9000, 106),y是(9000, 1)的回归标签,否则会报错。 - 特征预处理:强烈建议对
X1的时序特征和X2的结构化特征分别做标准化(比如StandardScaler),LSTM和Dense层对特征尺度非常敏感。 - LSTM参数调整:如果需要提取所有时间步的特征,可以把
return_sequences=True,然后接Flatten()或者堆叠LSTM层,但回归任务一般取最后一步的输出就足够。 - 过拟合应对:除了Dropout和早停,还可以在LSTM/Dense层加入L2正则化(比如
kernel_regularizer=tf.keras.regularizers.L2(0.01))。
内容的提问来源于stack exchange,提问作者Luca Massaron
相关产品推荐
相关产品推荐

