我正在使用Keras构建一个深度学习LSTM模型,使用TensorFlow后端。每次运行模型时,结果都不同。有没有办法修复种子以产生可重复的结果?谢谢!
答案 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)
从一开始的代码。希望对您有所帮助。