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

110
我每次运行Keras框架中的imdb_lstm.py示例(https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py)时,都会得到不同的结果(测试精度)。代码在顶部包含np.random.seed(1337),在任何keras导入之前。它应该防止它为每个运行生成不同的数字。我错过了什么吗?
更新:如何复制:
1.安装Keras(http://keras.io/) 2.执行https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py几次。它将训练模型并输出测试精度。 预期结果:每次运行时测试精度相同。 实际结果:每次运行时测试精度不同。
更新2:我正在Windows 8.1上使用MinGW / msys运行它,模块版本如下: theano 0.7.0 numpy 1.8.1 scipy 0.14.0c1
更新3:我已经缩小了问题的范围。如果我在GPU上运行示例(设置Theano标志设备= gpu0),则每次都会得到不同的测试准确性,但如果我在CPU上运行,则一切都按预期工作。我的显卡是:NVIDIA GeForce GT 635)

也许问题在于我使用的是Windows操作系统。 numpy.random.uniform运行良好,总是产生相同的结果。 - Pavel Surmenok
我将问题缩小了一点。如果我使用GPU运行示例(设置Theano标志设备= gpu0),则每次获得不同的测试准确度,但是如果我在CPU上运行它,则一切都符合预期。我的显卡:NVIDIA GeForce GT 635。 - Pavel Surmenok
5
GPU的代码必须大量使用类似于“SIMD”的指令。这可能会导致随机数生成器以随机顺序被调用。此外,GPU是相当自主的实体,它可能使用自己的随机数生成器。毕竟,在GPU上运行任何想要的代码并不容易。 - u354356007
1
请查看以下链接: http://deeplearning.net/software/theano/library/sandbox/rng_mrg.html 和 http://deeplearning.net/software/theano/tutorial/examples.html。 为了在GPU上每次获得相同的结果,您需要添加一些keras函数以便能够在GPU上正确地进行种子设置。 - James Tobin
3
你使用了哪个CUDA版本?你安装了cuDNN吗?我认为后者在速度上做出了一些牺牲,导致GPU上出现非确定性行为。(应该很微小,我认为这与反向传播时计算原子操作有关,但你可能不会每次得到相同的值。) - o1lo01ol1o
显示剩余4条评论
11个回答

0

我同意前面的评论,但是可重复的结果有时需要相同的环境(例如安装的软件包、机器特性等)。因此,建议将您的环境复制到其他地方,以便获得可重复的结果。尝试使用以下其中一种技术:

  1. Docker。如果您有Linux,这很容易将您的环境移动到其他地方。您还可以尝试使用DockerHub
  2. Binder。这是一个用于重现科学实验的云平台。
  3. Everware。这是另一个“可重复科学”的云平台。请查看Github上的项目存储库

我的问题是,即使在同一环境下运行训练两次,我也无法获得可重复的结果。 - Pavel Surmenok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接