2015-09-06 64 views
40

可重复的结果我得到不同的结果(测试精度)每次我任何keras进口之前运行从Keras框架(https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py) 的代码包含在顶部np.random.seed(1337)imdb_lstm.py例子时间。它应该防止它为每次运行生成不同的数字。我错过了什么?如何获得keras

UPDATE:如何瑞普:

  1. 安装Keras(http://keras.io/
  2. 执行https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py几次。它将训练模型并输出测试精度。
    预期结果:每次运行测试的准确性都是一样的。
    实际结果:每次运行测试精度都不同。

UPDATE2:我运行它在Windows 8.1中使用MinGW/MSYS,模块版本:
theano 0.7.0
numpy的1.8.1
SciPy的0.14.0c1

UPDATE3:我收窄这个问题倒退了一点。如果我用GPU运行这个例子(设置theano flag device = gpu0),那么我每次都得到不同的测试精度,但是如果我在CPU上运行它,那么一切都按预期工作。我的显卡:NVIDIA GeForce GT 635)

+0

我不能复制运行的代码在Ubuntu 14.04 –

+0

'theano - > 0.6.0','numpy的 - >“1.9.2'','SciPy的 - > '0.15.1' ' –

+0

也许问题是,我使用Windows。 numpy.random.uniform工作正常,总是产生相同的结果。 –

回答

10

Theano的documentation讨论了播种随机变量的困难,以及为什么它们使用自己的随机数生成器为每个图实例播种。

共享不同{{{RandomOp}}} 实例之间的随机数生成器使得难以无论 在图表其他OPS的制造相同的流,并且保持{{{RandomOps}}}隔离。 因此,图中的每个{{{RandomOp}}}实例将拥有其自己的随机数生成器。该随机数发生器是该函数的输入 。在典型用法中,我们将使用 函数输入({{{value}}},{{{update}}}}的新特性为每个{{{RandomOp}}}传递和更新rng 。通过传递RNG作为输入, 可以使用访问函数输入的常规方法来访问每个{{{RandomOp}}}的rng。在这种方法中,没有预先存在的机制来处理整个 图的组合随机数状态。因此,建议通过辅助功能提供遗漏的功能( 后三个要求):{{{seed,getstate, setstate}}}。

他们还提供examples关于如何播种所有的随机数发生器。

您也可以通过该对象的种子方法对由RandomMreams对象分配的所有随机变量进行种子播种。这个种子将是 用于播种一个临时的随机数发生器,这又将为 生成每个随机变量的种子。

>>> srng.seed(902340) # seeds rv_u and rv_n with different seeds each 
+8

但为了种子他们,我们需要访问keano将使用的theano的随机对象。是否可以通过keras API来完成? – max

0

我同意与先前的评论,但重复的结果有时需要在相同的环境(例如,安装的软件包,机械特性等)。因此,我建议将您的环境复制到其他地方以防重复结果。尝试使用下一种技术之一:

  1. Docker。如果你有一个Linux,这很容易将你的环境移到其他地方。您也可以尝试使用DockerHub
  2. Binder。这是一个复制科学实验的云平台。
  3. Everware。这是另一个“可重用科学”的云平台。请参阅Github上的project repository
+0

我的问题是,当我运行两次训练时,即使在相同的环境下,我也无法获得可重现的结果。 –

0

我已经训练和测试了Sequential()种使用Keras的神经网络。我对噪音语音数据进行非线性回归。我用下面的代码来生成随机种子:

import numpy as np 
seed = 7 
np.random.seed(seed) 

在同数据I训练每个时间和测试我得到的val_loss完全相同的结果。

+1

你使用过GPU吗?什么后端:Theano或TensorFlow? –

+0

我用了Theano后端的CPU。 –

+1

明白了。 CPU也适用于我。我只在GPU上运行时遇到问题。 –

1

我想补充一些以前的答案。如果您使用蟒蛇3和你想获得可重复的结果每次运行,你必须

  1. 集代码
  2. 给PYTHONHASHSEED = 0的开始numpy.random.seed作为参数传递给蟒编译器
+0

不再有效。 – Dmitry

6

我终于用我的代码得到了可重现的结果。这是我在网络上看到的答案的组合。第一件事是做什么@alex说:

  1. 设置numpy.random.seed;
  2. 使用PYTHONHASHSEED=0为Python 3

然后,你必须致电Keras代码具有以下附加THEANO_FLAGS来解决@ user2805751关于cuDNN注意的问题:

  • dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic
  • 最后,你需要修补Theano安装按this comment,基本上在于:

    1. theano/sandbox/cuda/opt.py中的所有呼叫替换为*_dev20运营商的常规版本。

    这应该会得到相同结果的相同种子。

    请注意,可能会有放缓。我看到运行时间增加了大约10%。