使用带有TensorFlow后端的Keras重现结果

时间:2018-02-05 21:13:57

标签: python-3.x tensorflow keras random-seed

我正在使用Keras构建一个深度学习LSTM模型,使用TensorFlow后端。每次运行模型时,结果都不同。有没有办法修复种子以产生可重复的结果?谢谢!

3 个答案:

答案 0 :(得分:3)

@Poete_Maudit在这里说:How to get reproducible results in keras

要获得可重复的结果,您必须在脚本的开始处执行以下操作(这将被强制使用单个CPU ):

# Seed value (can actually be different for each attribution step)
seed_value= 0

# 1. Set `PYTHONHASHSEED` environment variable at a fixed value
import os
os.environ['PYTHONHASHSEED']=str(seed_value)

# 2. Set `python` built-in pseudo-random generator at a fixed value
import random
random.seed(seed_value)

# 3. Set `numpy` pseudo-random generator at a fixed value
import numpy as np
np.random.seed(seed_value)

# 4. Set `tensorflow` pseudo-random generator at a fixed value
import tensorflow as tf
tf.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)

注意:您无法(再)使用命令PYTHONHASHSEED=0 python3 script.py来获得可重复的结果,因为https://keras.io/getting-started/faq/#how-can-i-obtain-reproducible-results-using-keras-during-development可能会让您想到,您必须使用os.environ设置PYTHONHASHSEED在脚本中,如步骤1所示。另外,此不适用于GPU使用

答案 1 :(得分:2)

与深度学习相关的固有随机性导致不可重现的结果,但您可以在一定程度上控制它。

由于我们使用深度神经网络,我们可以有不同的随机性影响我们的重现性,导致不同的结果,如

  • 初始化中的随机性,例如权重。

  • 正规化中的随机性,例如辍学。

  • 图层中的随机性。

  • 优化中的随机性。

但有几种方法可以缓解这一个选项,即使用汇总统计信息。另一种提供更可重复结果的方法是使用随机种子和numpy和/或tensorflow ,参见:

https://docs.scipy.org/doc/numpy-1.12.0/reference/generated/numpy.random.seed.html

https://www.tensorflow.org/api_docs/python/tf/set_random_seed

对于使用 GPU 的方法,我们可以指定它使用确定性方法而不是默认的非确定性方法。对于nvidia图形卡,请参阅:docs.nvidia.com/cuda

答案 2 :(得分:0)

基本上,使结果可再现的关键思想是禁用GPU 。这个非常重要。为此,只需添加

import os
import tensorflow as tf
import numpy as np
import random as rn

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = ""

sd = 1 # Here sd means seed.
np.random.seed(sd)
rn.seed(sd)
os.environ['PYTHONHASHSEED']=str(sd)

from keras import backend as K
config = tf.ConfigProto(intra_op_parallelism_threads=1,inter_op_parallelism_threads=1)
tf.set_random_seed(sd)
sess = tf.Session(graph=tf.get_default_graph(), config=config)
K.set_session(sess)

从一开始的代码。希望对您有所帮助。