Keras LSTM为什么使用“相同”模型和相同的权重得到不同的结果?

2024-06-06 16:04:45 发布

您现在位置:Python中文网/ 问答频道 /正文

注意:按照注释中的注释创建每个模型之前正确地修复RNG状态实际上修复了我的问题,因为在3个小数点以内的结果是一致的,但它们并不是完全如此,所以在某个地方存在一个隐藏的随机性源,而不是通过植入RNG来修复的。。。可能有些lib使用time milisecs或smth…如果有人对此有想法,知道这一点会很酷,所以我将等待,而不关闭问题:)

我创建了一个Keras LSTM模型(用于预测一些时间序列数据,不重要的是什么),每次我试图重新创建一个相同的模型(从json加载的相同模式配置,从文件加载的相同权重,编译函数的相同参数),我在同一列火车上得到的结果和测试数据相差甚远。为什么?

代码大致如下:

# fix random
import random
random.seed(42)

# make model & compile
model = Sequential([
    LSTM(50, input_shape=(None, 1), return_sequences=True),
    LSTM(100, return_sequences=False),
    Dense(1),
    Activation("linear")
])
model.compile(loss="mse", optimizer="rmsprop")

# save it and its initial random weights
model_json = model.to_json()
model.save_weights("model.h5")

# fit and predict
model.fit(x_train, y_train, epochs=3)
r = model.predict(x_test)

# create new "identical" model
model2 = model_from_json(model_json)
model2.load_weights("model.h5")
model2.compile(loss="mse", optimizer="rmsprop")

# fit and predict "identical" model
model2.fit(x_train, y_train, epochs=3)
r2 = model2.predict(x_test)

# ...different results :(

我知道这个模型有初始的随机权重,所以我把它们存起来重新加载。我也很多疑,以为有一些我可能不知道的“隐藏”参数,所以我将模型序列化为json并重新加载,而不是手动重新创建一个相同的(尝试过,同样的事情btw)。我还修正了随机数发生器。

这是我第一次和凯拉斯在一起,我也是神经网络的初学者。但这让我抓狂。。。世贸基金会可以改变?!


关于修复随机数生成器:我使用TensorFlow后端运行Keras,并且在开始时我有这些代码行来尝试修复rng,以便进行实验:

import random
random.seed(42)
import numpy
numpy.random.seed(42)
from tensorflow import set_random_seed
set_random_seed(42)

…但他们仍然无法解决随机性。

我知道目标是使我的模型表现为非随机的,尽管是NNs固有的随机性质。但我需要临时修复这个用于实验的目的(我甚至同意它只能在一台机器上重现!)。


Tags: and模型importjsonmodeltrainrandompredict