【发布时间】:2018-02-17 13:18:46
【问题描述】:
(注意:在每个模型创建之前正确修复 RNG 状态,如评论中的评论中所述,实际上解决了我的问题,因为 3 位小数内的结果是一致的,但是不是完全如此,所以有一个隐藏的随机性来源没有通过播种RNG来解决......可能有些lib使用时间毫秒或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 并重新加载,而不是手动重新创建一个相同的参数(尝试过,顺便说一句)。而且我还修复了随机数生成器。
这是我第一次接触 Keras,总的来说我也是神经网络的初学者。但这让我发疯...... wtf可以变化?!
关于修复随机数生成器:我使用 TensorFlow 后端运行 Keras,并且在开始时我有这些代码行来尝试修复 RNG 以用于实验目的:
import random
random.seed(42)
import numpy
numpy.random.seed(42)
from tensorflow import set_random_seed
set_random_seed(42)
...但他们仍然没有修复随机性。
而且我知道目标是让我的模型表现得非随机尽管具有 NN 固有的随机性。但出于实验目的,我需要临时修复此问题(我什至可以在一台机器上重现它!)。
【问题讨论】:
-
我不确定这会如何影响结果,但您还没有“修复”第二个模型的随机数生成器。您需要从相同的状态 (seed=42) 再次启动它,并且您需要第二次对生成器运行完全相同的一组调用。此外,您不知道 Keras 是如何获得它的随机数的!事实上,它很可能不是从
random模块中获取它们的。正如下面的答案所假设的那样,它甚至可能无法从numpy获得它们。 -
如果你想获得一致的结果,你应该指定不同的种子。根据 keras 后端(theano 或 tensorflow),有两种方法可以指定随机种子。见这里:stackoverflow.com/questions/45970112/…
-
@senderle 这个。我没有意识到当然RNG状态在运行时会发生变化,所以我不仅需要在开始时修复它,还要在制作model2之前重新修复它......猜猜它是“星期五炸脑” :) 这几乎解决了我的问题,从某种意义上说仍然存在随机性,但是前 3 位小数是可重现的(我想某些库依赖项有它自己隐藏的随机事物) .这已经足够好了,所以我可以将“实际方差”(仅基于稍微不同的训练数据的不同预测)与“模型随机性”区分开来,并且可以开始着手解决第一个问题!谢谢!
-
你是在 GPU 上训练吗?
-
谢谢!我发现 TensorFlow 2.2 附带一个操作系统环境变量 TF_DETERMINISTIC_OPS,如果设置为“1”,将确保仅使用确定性 GPU 操作。设置为 1 修复了我的大部分 GPU 不确定性,除了一些我最终留在 CPU 上的 TensorFlow 操作。
标签: python machine-learning neural-network keras lstm