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

如何在Keras中实现独立Conv2D头输出按时间维度合并后接入LSTM

报错原因
  • Keras中Concatenate层的调用规则为:先实例化层(指定拼接维度),再将待拼接的张量列表作为参数传入实例化后的层,你原代码直接把张量列表传给了Concatenate的构造函数,触发张量类型错误。
  • Conv2D输出的是4维张量(样本数, 特征图高, 特征图宽, 通道数),不符合LSTM要求的3维输入格式(样本数, 时间步, 特征数),需要先对卷积输出做维度转换。
修正后实现代码
import keras
from keras import layers

Matrix_Dimension = 20
Input_Window = 4

Input_Matrixes = []
processed_timestep_features = []

for i in range(Input_Window):
    # 每个时间步的输入矩阵对应独立输入层
    Inp_Matrix = layers.Input(shape=(Matrix_Dimension, Matrix_Dimension, 1))
    Input_Matrixes.append(Inp_Matrix)
    # 每个时间步对应独立Conv2D层,权重不共享,符合需求
    conv = layers.Conv2D(64, 5, activation='relu')(Inp_Matrix)
    # 卷积输出降维为一维特征向量
    pooled = layers.GlobalAveragePooling2D()(conv)
    # 增加时间维度,形状变为 (样本数, 1, 特征数)
    timestep_feat = layers.Reshape((1, -1))(pooled)
    processed_timestep_features.append(timestep_feat)

# 沿时间维度(axis=1)拼接所有时间步特征,得到形状 (样本数, Input_Window, 特征数)
Spatial_Layers_Concate = layers.Concatenate(axis=1)(processed_timestep_features)

# 传入LSTM层,LSTM的隐藏单元数可根据需求调整
LSTM_Layer = layers.LSTM(32, activation='relu', return_sequences=False)(Spatial_Layers_Concate)

# 输出层根据你的预测任务调整,这里示例是单值回归
output = layers.Dense(1)(LSTM_Layer)

Model = keras.Model(Input_Matrixes, output)
Model.compile(optimizer='adam', loss=keras.losses.MeanSquaredError())
方案说明
  • 循环创建独立Conv2D层的逻辑保留,完全实现每个输入矩阵对应独立可训练卷积参数,没有权重共享,无需使用TimeDistributed层。
  • 输入数据准备时,需要将滑动窗口的N个矩阵拆分为N个独立数组作为模型输入,和输入层的数量对应。
  • 如果需要保留卷积输出的空间信息,也可以将GlobalAveragePooling2D替换为Flatten,调整对应特征维度即可。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:06:03