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

fkvaft9z  于 2023-02-04  发布在  其他
关注(0)|答案(3)|浏览(257)

我在简单的数据集上建立了Keras序列模型。我可以训练模型,但是每次我尝试对相同的输入进行预测时,我得到的值都不一样。有人知道为什么吗?我在这里读了不同的Stackoverflow(Why the exactly identical keras model predict different results for the same input data in the same envKeras saved model predicting different values on different sessiondifferent prediction after load a model in 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)

现在,每次运行以下代码以获得预测结果时,都会得到不同的结果,如您所见
一个三个三个一个

tcbh2hod

tcbh2hod1#

问题是在LSTM层中设置stateful=True,因为这会保持predict调用之间的状态,所以每个预测都依赖于之前的预测。
因此,作为一个解决方案,设置stateful=False

vtwuwzda

vtwuwzda2#

我认为this库和它附带的文档对您的工作会很有趣。
基于上面的库,在我最近与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'

结果似乎有很大的决定性,这对我当时的工作来说已经足够好了。

w8f9ii69

w8f9ii693#

根据@Dr.Snoopy,问题是设置stateful = True。将其设置为False修复了问题。“布尔值(默认为False)。如果为True,则一个批次中索引i处每个样本的最后一个状态将用作下一批次中索引i处样本的初始状态。”我的误解是这只适用于训练。
感谢@史努比博士指出这一点。

相关问题