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

Keras有状态LSTM模型同一输入预测结果不一致问题

Keras有状态LSTM模型预测结果不一致问题

我基于简单数据集构建了一个Keras序列模型,模型训练正常,但每次对同一输入执行预测时,都会得到不同的结果。尝试设置TensorFlow种子后问题仍存在。

数据集构建代码

from pandas import concat
from pandas import DataFrame
# 创建序列
length = 10
sequence = [i/float(length) for i in range(length)]
# 生成X/y对
df = DataFrame(sequence)
df = concat([df, df.shift(1)], axis=1)
df.dropna(inplace=True)
print(df)
# 转换为LSTM兼容格式
values = df.values
X, y = values[:, 0], values[:, 1]
X = X.reshape(len(X), 1, 1)
print(X.shape, y.shape)

数据集输出

0    0
1  0.1  0.0
2  0.2  0.1
3  0.3  0.2
4  0.4  0.3
5  0.5  0.4
6  0.6  0.5
7  0.7  0.6
8  0.8  0.7
9  0.9  0.8
(9, 1, 1) (9,)

模型构建代码

# 配置网络
from tensorflow import keras
from keras.models import Sequential
from keras.layers import Dense
from keras.layers import LSTM
tf.random.set_seed(1337)

n_batch = len(X)
n_neurons = 10
# 定义网络
model = Sequential()
model.add(LSTM(n_neurons, batch_input_shape=(n_batch, X.shape[1], X.shape[2]), stateful=True))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X,y,epochs=2,batch_size=n_batch,verbose=1,shuffle=False)

问题表现

每次执行model.predict(X)得到不同结果,示例如下:
第一次输出:

array([[0.03817442],
       [0.07164046],
       [0.10493257],
       [0.13797525],
       [0.17069395],
       [0.20301574],
       [0.23486984],
       [0.26618803],
       [0.29690543]], dtype=float32)

第二次输出:

array([[0.04415776],
       [0.08242793],
       [0.12048437],
       [0.15823033],
       [0.19556962],
       [0.2324073 ],
       [0.26865062],
       [0.3042098 ],
       [0.33899906]], dtype=float32)

问题原因

核心问题在于使用了**stateful=True的LSTM层**:
有状态LSTM会在批次之间保留内部隐藏状态,不会自动重置。第一次预测后,模型的隐藏状态会保留下来,第二次预测时会基于这个已更新的状态计算结果,导致输出不一致。而当前数据集的(X,y)是独立的样本对,完全不需要保留跨批次的状态。

解决方法

有两种可行方案:

方案1:每次预测前重置模型状态

如果一定要保留stateful=True(比如后续需要处理连续序列),每次预测前手动重置状态:

model.reset_states()  # 重置LSTM的隐藏状态
model.predict(X)

方案2:修改为无状态LSTM(更适合当前场景)

直接将LSTM层的stateful参数改为False,同时调整输入形状定义(不需要指定batch_size):

model = Sequential()
# 替换原LSTM层定义
model.add(LSTM(n_neurons, input_shape=(X.shape[1], X.shape[2]), stateful=False))
model.add(Dense(1))
model.compile(loss='mean_squared_error', optimizer='adam')
model.fit(X,y,epochs=2,batch_size=n_batch,verbose=1,shuffle=False)

修改后每次预测都会从初始状态开始,结果完全一致。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.02 03:25:26