我正在使用Keras构建深度学习LSTM模型,使用TensorFlow后端。每次运行模型时,结果都不同。有没有一种方法可以固定种子以创建可重复的结果?谢谢!
我正在使用Keras构建深度学习LSTM模型,使用TensorFlow后端。每次运行模型时,结果都不同。有没有一种方法可以固定种子以创建可重复的结果?谢谢!
如@Poete_Maudit在这里所说:如何在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.random.set_seed(seed_value) # tensorflow 2.x
# tf.set_random_seed(seed_value) # tensorflow 1.x
# 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使用。
tf.random.set_random_seed(seed_value)
已更改为tf.random.set_seed(seed_value)
。 - Giora Simchoni深度学习存在固有的随机性,导致结果不可重复,但是您可以在一定程度上控制它。
由于我们使用深度神经网络,因此可能会出现不同的随机性影响我们的可重复性,导致不同的结果,例如:
初始化中的随机性,例如权重。
正则化中的随机性,例如丢弃。
层中的随机性。
优化中的随机性。
但有几种方法可以缓解这个问题,其中一种选项是使用汇总统计数据。另一种提供更可重复结果的方法是使用 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基本上,使结果可重现的关键思想是禁用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)
在你的代码的最开始处。希望这可以帮到你。