使用TensorFlow后端的Keras实现可重复的结果

12

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


1
请查看我在这里的回答(https://dev59.com/slwY5IYBdhLWcg3wnY13#52897216),关于使用CPU的问题。 - Outcast
3个回答

10

如@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使用


这个代码片段对我不起作用。我正在使用来自 TensorFlow(版本1.14.0)的 Keras API(2.2.4-tf)在 Google Co-lab 中进行深度学习。请建议。 - Dr Nisha Arora
1
对于Tensorflow 2.0,tf.random.set_random_seed(seed_value)已更改为tf.random.set_seed(seed_value) - Giora Simchoni

3

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

由于我们使用深度神经网络,因此可能会出现不同的随机性影响我们的可重复性,导致不同的结果,例如:

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

  • 正则化中的随机性,例如丢弃。

  • 层中的随机性。

  • 优化中的随机性。

但有几种方法可以缓解这个问题,其中一种选项是使用汇总统计数据。另一种提供更可重复结果的方法是使用 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

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)

在你的代码的最开始处。希望这可以帮到你。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接