【发布时间】:2015-12-01 21:05:09
【问题描述】:
每次我从 Keras 框架 (https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py) 运行 imdb_lstm.py 示例时都会得到不同的结果(测试准确度)
代码在顶部包含np.random.seed(1337),在任何 keras 导入之前。它应该防止它为每次运行生成不同的数字。我错过了什么?
更新:如何复制:
- 安装 Keras (http://keras.io/)
- 执行几次https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py。它将训练模型并输出测试精度。
预期结果:每次运行的测试准确度都相同。
实际结果:每次运行的测试准确度都不同。
UPDATE2:我在带有 MinGW/msys 的 Windows 8.1 上运行它,模块版本:
theano 0.7.0
numpy 1.8.1
scipy 0.14.0c1
UPDATE3:我把问题缩小了一点。如果我使用 GPU 运行示例(设置 theano 标志 device=gpu0),那么我每次都会得到不同的测试精度,但是如果我在 CPU 上运行它,那么一切都会按预期工作。我的显卡:NVIDIA GeForce GT 635)
【问题讨论】:
-
我无法在 ubuntu 14.04 上复制运行代码
-
theano -> 0.6.0,numpy -> '1.9.2',scipy -> '0.15.1' -
可能问题在于我使用的是 Windows。 numpy.random.uniform 工作正常,总是产生相同的结果。
-
GPU 代码必须大量使用
SIMD-like 指令。这可能会导致以随机顺序调用随机生成器。 GPU 也是一个自治实体,它可以使用自己的随机生成器。毕竟,在 GPU 上运行任何你想要的代码都不是一件容易的事。 -
您使用的是哪个 CUDA 版本?你安装了 cuDNN 吗?我相信后者会为速度做出一些牺牲,从而导致 gpu 上的非确定性行为。 (应该是轻微的,我认为这与在 backrprop 上计算的原子操作有关,但你不会每次都得到相同的值。)