每次从 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
UPDATE3:我把问题缩小了一点。如果我使用 GPU 运行示例(设置 theano flag device=gpu0),那么我每次都会得到不同的测试精度,但是如果我在 CPU 上运行它,那么一切都会按预期工作。我的显卡:NVIDIA GeForce GT 635)
最佳答案
您可以在 Keras 文档中找到答案:https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development .
简而言之,要绝对确保您的 Python 脚本在一台计算机/笔记本电脑的 CPU 上能够获得可重现的结果,那么您必须执行以下操作:
- 将
PYTHONHASHSEED
环境变量设置为固定值 - 将
python
内置的伪随机生成器设置为固定值 - 将
numpy
伪随机生成器设置为固定值 - 将
tensorflow
伪随机生成器设置为固定值 - 配置一个新的全局
tensorflow
session
按照顶部的 Keras
链接,我使用的源代码如下:
# Seed value
# Apparently you may use different seed values at each stage
seed_value= 0
# 1. Set the `PYTHONHASHSEED` environment variable at a fixed value
import os
os.environ['PYTHONHASHSEED']=str(seed_value)
# 2. Set the `python` built-in pseudo-random generator at a fixed value
import random
random.seed(seed_value)
# 3. Set the `numpy` pseudo-random generator at a fixed value
import numpy as np
np.random.seed(seed_value)
# 4. Set the `tensorflow` pseudo-random generator at a fixed value
import tensorflow as tf
tf.random.set_seed(seed_value)
# for later versions:
# tf.compat.v1.set_random_seed(seed_value)
# 5. Configure a new global `tensorflow` session
from keras import backend as K
session_conf = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
sess = tf.Session(graph=tf.get_default_graph(), config=session_conf)
K.set_session(sess)
# for later versions:
# session_conf = tf.compat.v1.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
# sess = tf.compat.v1.Session(graph=tf.compat.v1.get_default_graph(), config=session_conf)
# tf.compat.v1.keras.backend.set_session(sess)
不用说你不必在numpy
、scikit-中指定任何
或 seed
或random_state
学习tensorflow
/keras
函数,因为使用上面的源代码,我们将它们的伪随机生成器全局设置为固定值(value)。
关于python - 如何在 keras 中获得可重现的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32419510/