Keras模型使用相同输入预测结果不同

3
我在简单数据集上构建了一个Keras顺序模型。我能够训练模型,但每次尝试对相同的输入进行预测时,我都会得到不同的值。有人知道为什么吗?我阅读了不同的Stackoverflow页面(为什么完全相同的Keras模型在相同环境下对相同输入数据进行预测会产生不同的结果Keras保存的模型在不同会话中预测不同的值在Keras中加载模型后进行不同的预测),但找不到答案。我尝试设置Tensorflow种子,但仍然得到不同的结果。 这是我的代码。
from pandas import concat
from pandas import DataFrame
# create sequence
length = 10
sequence = [i/float(length) for i in range(length)]
# create X/y pairs
df = DataFrame(sequence)
df = concat([df, df.shift(1)], axis=1)
df.dropna(inplace=True)
print(df)
# convert to LSTM friendly format
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,)

那么开始构建模型吧。
#configure network
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
#design network
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)
********output**************
 array([[0.03817442],
       [0.07164046],
       [0.10493257],
       [0.13797525],
       [0.17069395],
       [0.20301574],
       [0.23486984],
       [0.26618803],
       [0.29690543]], dtype=float32)

model.predict(X)
********output**************
array([[0.04415776],
       [0.08242793],
       [0.12048437],
       [0.15823033],
       [0.19556962],
       [0.2324073 ],
       [0.26865062],
       [0.3042098 ],
       [0.33899906]], dtype=float32)

你知道在 LSTM 中将 stateful 设置为 True 有什么作用吗? - Dr. Snoopy
我不确定,但我认为将stateful设置为True会保存每个样本的最后状态,并将其用作下一个样本的初始状态。但是我认为这仅适用于建立模型,我错了吗?这里是Tensorflow文档的解释。https://www.tensorflow.org/api_docs/python/tf/keras/layers/LSTM - Shahin Shirazi
1
正确,但它不仅仅用于训练,还可以用于预测。 - Dr. Snoopy
非常感谢,你是正确的。我把它改成了False并开始工作。感激不尽。 - Shahin Shirazi
3个回答

2

我认为这个库及其附带的文档对你的工作很有帮助。

基于上述库,在我最近与Keras合作的项目中,我的代码起始如下:

import os
import numpy as np
from numpy.random import seed
seed(42)
rng = np.random.RandomState(42)
import tensorflow
tensorflow.random.set_seed(42)
os.environ['TF_DETERMINISTIC_OPS'] = '1'

结果似乎有很强的决定论性质,在当时我所从事的工作中已经足够好了。


不,这只是一个错误的猜测。 - Dr. Snoopy
@Dr.Snoopy 这些模型是否有可能表现出确定性行为?如果是,如何通过编程实现呢? - Higo Felipe Silva Pires

2
问题在于在LSTM层中设置stateful=True,这会在预测调用之间保留状态,因此每个预测都依赖于先前的预测。
因此,解决方案是将stateful=False

0

根据@Dr.Snoopy的说法,问题是设置了stateful = True. 将其设置为False即可解决问题。“布尔值(默认为False)。如果为True,则将批处理中索引i处每个样本的最后状态用作下一批次中索引i处样本的初始状态。” 而我误解的是这仅适用于训练。

感谢@Dr.Snoopy指出这一点。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接