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

如何为Keras中1DCNN+LSTM串联网络设置输入形状?

实现Input -> CNN -> LSTM -> Dense -> Output网络结构方案

没问题,我帮你把这个网络结构的实现思路和代码整理清楚,完全贴合你的需求:

一、核心参数与结构梳理

先把你的需求转化为明确的网络参数:

  • 输入规格:100个时间步,每个时间步对应64维特征向量 → 输入形状为 (None, 100, 64)(None代表批量大小,可灵活调整)
  • Conv1D层:64个滤波器,每个滤波器长度(卷积核大小)为16抽头,目标是提取每个时间步的特征
  • MaxPooling层:提取卷积输出的最大值,最终保留每个时间步的64维特征
  • 后续连接LSTM层处理序列特征,最后通过Dense层输出结果

二、代码实现(基于TensorFlow/Keras)

用最常用的深度学习框架来实现,代码里加了详细注释,方便你理解和调整:

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Conv1D, MaxPooling1D, LSTM, Dense

# 初始化序列模型
model = Sequential()

# 1. Conv1D特征提取层
# padding='same' 保证输出的时间步数和输入一致(100),完美匹配你"提取每个时间步特征"的需求
model.add(Conv1D(
    filters=64,
    kernel_size=16,
    activation='relu',
    input_shape=(100, 64),
    padding='same'
))

# 2. MaxPooling层
# 如果需要严格保留100个时间步,把pool_size设为1即可;这里用pool_size=2是为了适度压缩特征、降低计算量
# padding='same' 确保时间步数量的调整是均匀的
model.add(MaxPooling1D(pool_size=2, padding='same'))

# 3. LSTM序列处理层
# return_sequences=False 表示只传递最后一个时间步的输出给Dense层;如果需要传递所有时间步输出,可设为True
model.add(LSTM(64, return_sequences=False))

# 4. Dense输出层
# 这里默认用二分类的配置,你可以根据任务调整:比如多分类用softmax+对应单元数,回归任务去掉activation参数
model.add(Dense(1, activation='sigmoid'))

# 模型编译(根据任务调整损失函数和优化器)
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])

# 查看模型结构
model.summary()

三、关键细节说明

  • Conv1D的padding设置:用padding='same'是为了让卷积后的时间步数量和输入一致,这样每个原始时间步都能对应到一个卷积后的特征输出,完全符合你“提取每个时间步特征”的要求。
  • MaxPooling的灵活调整:如果你必须保留100个时间步,把pool_size=1即可;如果任务允许压缩时间步,pool_size=2或更大的值能有效减少计算量,同时保留关键特征。
  • LSTM的return_sequences参数:如果你的Dense层需要处理每个时间步的LSTM输出(比如多步预测),把这个参数设为True,并且用TimeDistributed(Dense(...))来包装输出层,这样每个时间步都会对应一个输出结果。

内容的提问来源于stack exchange,提问作者陳一寬

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:21:50