如何在keras中获得可重复的结果

每次我从imdb_lstm.py框架运行imdb_lstm.py示例( https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py )时,我得到了不同的结果(testing准确性)。代码包含np.random.seed(1337)在顶部,在任何kerasimport之前。 它应该防止它为每次运行产生不同的数字。 我错过了什么?

更新:如何repro:

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

UPDATE2:我使用MinGW / msys,模块版本在Windows 8.1上运行它:
theano 0.7.0
numpy 1.8.1
scipy 0.14.0c1

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

Theano的文档讨论了播种随机variables的困难,以及为什么他们使用自己的随机数生成器为每个graphics实例播种。

在不同的{{{RandomOp}}}实例之间共享一个随机数生成器使得生成相同的数据stream变得困难,而不pipe图中的其他操作如何,并且保持{{{RandomOps}}}孤立。 因此,图中的每个{{{RandomOp}}}实例将拥有其自己的随机数生成器。 该随机数发生器是该函数的input。 在典型的用法中,我们将使用函数input({{{value}}},{{{update}}})的新特性来传递和更新每个{{{RandomOp}}}的rng。 通过传递RNG作为input,可以使用访问函数input的常规方法来访问每个{{{RandomOp}}}的rng。 在这种方法中,没有预先存在的机制来处理整个graphics的组合随机数状态。 所以build议通过辅助函数提供缺less的function(最后三个需求):{{{seed,getstate,setstate}}}。

他们还提供了如何种子所有随机数发生器的例子 。

您还可以通过该对象的种子方法为RandomStreams对象分配的所有随机variables。 这个种子将被用来播种一个临时的随机数发生器,这将随后为每个随机variables产生种子。

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

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

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

然后,您必须通过使用以下附加的THEANO_FLAGS来调用您的Keras代码来解决@ user2805751关于cuDNN的问题:

  1. dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic

最后,你必须根据这个评论来修补你的Theano安装, 这个评论主要包括:

  1. 将所有对*_dev20操作符的调用replace为theano/sandbox/cuda/opt.py常规版本。

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

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

我想补充一些以前的答案。 如果您使用python 3,并且想要获得每次运行可重复的结果,则必须

  1. 在代码的开头设置numpy.random.seed
  2. 给PYTHONHASHSEED = 0作为python解释器的参数

我同意以前的评论,但是可重现的结果有时需要相同的环境(例如安装的包装,机器特性等)。 所以,我build议将您的环境复制到其他地方,以防重复的结果。 尝试使用下一个技术之一:

  1. Docker 。 如果你有一个Linux,这很容易把你的环境移到其他地方。 你也可以尝试使用DockerHub 。
  2. 粘合剂 。 这是一个复制科学实验的云平台。
  3. Everware 。 这是又一个“可重用科学”的云平台。 请参阅Github上的项目存储库 。

我已经使用Keras训练并testing了Sequential()类neural network。 我对有噪声的语音数据进行非线性回归。 我使用下面的代码来生成随机种子:

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

每次我训练和testing相同的数据时,我都会得到与val_loss完全相同的结果。