python - 如何在 keras 中获得可重现的结果

标签 python numpy theano keras

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

更新:如何复制:

  1. 安装 Keras (http://keras.io/)
  2. 执行 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 上能够获得可重现的结果,那么您必须执行以下操作:

  1. PYTHONHASHSEED 环境变量设置为固定值
  2. python内置的伪随机生成器设置为固定值
  3. numpy 伪随机生成器设置为固定值
  4. tensorflow 伪随机生成器设置为固定值
  5. 配置一个新的全局 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)

不用说你不必在numpyscikit-中指定任何seedrandom_state学习tensorflow/keras 函数,因为使用上面的源代码,我们将它们的伪随机生成器全局设置为固定值(value)。

关于python - 如何在 keras 中获得可重现的结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32419510/

相关文章:

python - 类型错误:需要 float - Python

python - 无法合并多个输入 tf.keras 模型/错误 : Graph disconnected: cannot obtain value for tensor Tensor

python - 评估 TensorFlow 张量时执行卡住

python-3.x - Psycopg2 无法将 numpy nans 写入 postgresql 表 : invalid input syntax for type double precision: ""

theano - 如何在不重建图形的情况下重用具有不同共享变量的 Theano 函数?

python - Keras 中实现了哪个版本的 LSTM?

python - Django - 在一页中列出许多不同的模型

python - 为什么 python dict 键/值不像鸭子一样嘎嘎叫?

python-3.x - 在 python 3 中使用 numpy 创建低秩矩阵近似

python - 访问 keras 模型输出相对于输入的梯度值