每次从Keras框架(https://github.com/fchollet/keras/blob/master/examples/imdb_lstm.py)运行 imdb_lstm.py
示例时,我得到不同的结果(测试准确性)在任何keras导入之前,代码在顶部包含 np.random.seed(1337)
. 它应该防止它为每次运行生成不同的数字 . 我错过了什么?
更新:如何重新制作:
-
安装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
更新3:我把问题缩小了一点 . 如果我用GPU运行示例(设置theano flag device = gpu0),那么每次都会得到不同的测试精度,但是如果我在CPU上运行它,那么一切都按预期工作 . 我的显卡:NVIDIA GeForce GT 635)
6 回答
我同意之前的评论,但可重现的结果有时需要相同的环境(例如已安装的软件包,机器特性等) . 因此,我建议将您的环境复制到其他地方,以便获得可重现的结果 . 尝试使用以下技术之一:
Docker . 如果你有Linux,这很容易将你的环境转移到其他地方 . 您也可以尝试使用DockerHub .
Binder . 这是一个用于复制科学实验的 Cloud 平台 .
Everware . 这是"reusable science"的另一个 Cloud 平台 . 请参阅Github上的project repository .
我终于用我的代码获得了可重现的结果 . 这是我在网上看到的答案的组合 . 首先是做@alex所说的:
设置
numpy.random.seed
;使用
PYTHONHASHSEED=0
for Python 3 .然后你必须通过调用你的Keras代码解决有关cuDNN的@ user2805751注意到的问题,其中包含以下附加内容:
THEANO_FLAGS
:dnn.conv.algo_bwd_filter=deterministic,dnn.conv.algo_bwd_data=deterministic
最后,您必须根据this comment修补您的Theano安装,其基本包括:
*_dev20
运算符的所有调用替换为theano/sandbox/cuda/opt.py
中的常规版本 .这应该会为同一种子获得相同的结果 .
请注意,可能会放缓 . 我看到运行时间增加了大约10% .
我想在之前的答案中添加一些东西 . 如果您使用 python 3 并且希望每次运行都能获得可重现的结果,那么您必须这样做
在代码的开头设置numpy.random.seed
将PYTHONHASHSEED = 0作为python解释器的参数
Theano的documentation讨论了随机变量播种的困难,以及为什么他们用自己的随机数生成器为每个图形实例播种 .
他们还提供了关于如何为所有随机数生成器播种的examples .
你可以在Keras docs找到答案:https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development .
简而言之,要绝对确保使用python脚本 on one computer's/laptop's CPU 可以获得可重现的结果,那么您必须执行以下操作:
将
PYTHONHASHSEED
环境变量设置为固定值将
python
内置伪随机生成器设置为固定值将
numpy
伪随机生成器设置为固定值将
tensorflow
伪随机生成器设置为固定值配置新的全局
tensorflow
会话在顶部的
Keras
链接之后,我使用的源代码如下:不用说,您不必在python脚本中使用的
numpy
,scikit-learn
或tensorflow
/keras
函数中指定任何seed
或random_state
,因为使用上面的源代码我们全局设置它们的伪随机生成器在一个固定的 Value .我使用Keras训练和测试了
Sequential()
种神经网络 . 我表演非噪声语音数据的线性回归 . 我使用以下代码生成随机种子:每次我训练和测试相同的数据时,我得到完全相同的
val_loss
结果 .