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

基于Keras与TensorFlow构建LSTM序列模型:层设置规则及代码解析

Keras LSTM模型代码解析与常见疑问解答

代码逐行解析

先看完整的示例代码:

from keras.models import Sequential
from keras.layers import LSTM
from keras.layers import Dropout
from keras.layers import Dense
numUnits = 50
model = Sequential()
model.add( LSTM(units=numUnits,return_sequences=True,
                input_shape=(X_train.shape[1], 1)) )
model.add( Dropout(0.2) )

model.add( LSTM(units=numUnits) )
model.add( Dropout(0.2) )

model.add( Dense(units=1) )
model.compile( loss='mean_squared_error' )

逐行拆解含义:

  • 导入核心模块:

    from keras.models import Sequential
    from keras.layers import LSTM
    from keras.layers import Dropout
    from keras.layers import Dense
    

    导入构建模型需要的组件:Sequential是线性堆叠的模型框架,LSTM是处理序列数据的循环神经网络层,Dropout是防止过拟合的正则化层,Dense是全连接层。

  • 定义超参数:

    numUnits = 50
    

    设置LSTM层的神经元数量为50,这个数值是可调超参数,需根据任务复杂度、数据量灵活调整。

  • 初始化模型:

    model = Sequential()
    

    创建一个Sequential模型,这种结构适合按顺序逐层堆叠的简单网络,是最常用的模型初始化方式之一。

  • 添加第一个LSTM层:

    model.add( LSTM(units=numUnits,return_sequences=True,
                    input_shape=(X_train.shape[1], 1)) )
    

    这是模型的第一层循环层:

    • units=numUnits:指定该层包含50个LSTM神经元;
    • return_sequences=True:开启序列输出模式,返回每个时间步的输出——因为后面要堆叠另一个LSTM层,必须让前一层输出完整序列供下一层处理;
    • input_shape=(X_train.shape[1], 1):定义输入数据的形状,X_train.shape[1]是输入序列的时间步长度,1是每个时间步的特征数,这是LSTM输入的标准格式(仅需指定时间步和特征数,样本数会自动匹配)。
  • 添加第一个Dropout层:

    model.add( Dropout(0.2) )
    

    随机丢弃当前层20%的神经元输出,通过减少神经元间的依赖关系,避免模型过拟合。

  • 添加第二个LSTM层:

    model.add( LSTM(units=numUnits) )
    

    堆叠第二个LSTM层,这里默认return_sequences=False,只返回序列最后一个时间步的输出——因为后面要接全连接层做最终单值预测,不需要完整序列。

  • 添加第二个Dropout层:

    model.add( Dropout(0.2) )
    

    再次对LSTM层的输出做正则化,进一步降低过拟合风险。

  • 添加输出层:

    model.add( Dense(units=1) )
    

    用全连接层输出最终结果,units=1表示输出一个数值,适合单变量回归任务(比如时间序列的数值预测)。

  • 编译模型:

    model.compile( loss='mean_squared_error' )
    

    配置模型训练参数:指定损失函数为均方误差(MSE),这是回归任务的常用损失;未显式指定优化器时,默认使用Adam优化器。


常见疑问解答

1. 是否需要在每层后都使用Dropout?

完全没必要。Dropout是可选的正则化手段,核心作用是抑制过拟合:

  • 如果模型训练时出现「训练集损失极低,但验证集损失居高不下」的过拟合现象,可以考虑添加Dropout;
  • 如果模型本身欠拟合(训练集和验证集损失都很高),加Dropout会进一步削弱模型学习能力,反而适得其反;
  • 实际使用中可灵活调整:只在部分层后加Dropout,或者调整丢弃比例(通常在0.1-0.5之间),没有固定要求。

2. 模型是否必须以Dense层结尾?

不是,结尾层的选择完全由任务类型决定:

  • 对于单变量回归、二分类/多分类等简单任务,通常用Dense层输出结果,比如示例中的回归任务用Dense(1)输出单值;
  • 对于序列标注任务(比如命名实体识别、词性标注),可以让最后一层LSTM返回完整序列(设置return_sequences=True),或者搭配TimeDistributed(Dense(...))对每个时间步做预测,不需要单独的Dense结尾;
  • 其他特殊任务(比如图像生成、语音合成)可能会用卷积层、循环层甚至自定义层结尾,完全看任务需求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 12:20:43