Tensorflow:具有相同随机种子的不同结果

时间:2019-01-04 23:54:42

标签: python tensorflow random random-seed openai-gym

我正在以Tensorflow实现的体育馆环境(BipedalWalker-v2)中运行强化学习程序。我已经如下手动设置了环境的随机种子,tensorflow和numpy

os.environ['PYTHONHASHSEED']=str(42)
random.seed(42)
np.random.seed(42)
tf.set_random_seed(42)

env = gym.make('BipedalWalker-v2')
env.seed(0)

config = tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)
config.gpu_options.allow_growth = True
sess = tf.Session(config=config)
# run the graph with sess

但是,每次运行程序都会得到不同的结果(无需更改任何代码)。为什么结果不一致,为什么要获得相同的结果该怎么办?


更新:

我能想到的唯一可能引入随机性的地方(除了神经网络)是

  1. 我使用tf.truncated_normal生成随机噪声epsilon,以实现噪声层
  2. 我使用np.random.uniform从重播缓冲区中随机选择样本

我还发现,我获得的分数在前10集中相当一致,但随后开始有所不同。诸如损失之类的其他事物也显示出相似的趋势,但数值上却不同。

更新2

我还设置了“ PYTHONHASHSEED”并使用@ jaypops96所述的单线程CPU,但仍然无法重现结果。上面的代码块中的代码已更新

3 个答案:

答案 0 :(得分:1)

似乎张量流神经网络在训练期间引入了随机性,不受随机数随机种子控制。随机性似乎至少可能来自python哈希操作和以非受控顺序执行的并行化操作。

通过遵循此响应中的设置步骤,我成功使用了keras-tensorflow NN获得了100%的可重复性: How to get reproducible results in keras

具体来说,我在该链接中使用了@Poete Maudit提出的公式。

关键是要为numpy,python和tensorflow设置随机种子值UP FRONT,然后还要在专门配置的会话中使tensorflow在单线程CPU上运行。

这是我使用的代码,从我发布的链接中进行了很小的更新。

print('Running in 1-thread CPU mode for fully reproducible results training a CNN and generating numpy randomness.  This mode may be slow...')
# Seed value
# Apparently you may use different seed values at each stage
seed_value= 1

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

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

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

# 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
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)
tf.keras.backend.set_session(sess)

#rest of code...

答案 1 :(得分:1)

我建议检查您的TensorFlow图是否包含不确定的操作。显然,reduce_sum是这样的一种操作。这些操作是不确定的,因为浮点加法和乘法是不关联的(浮点数的加或乘顺序会影响结果),并且因为此类操作不能保证每次输入都以相同顺序加或乘。我不知道不确定的TensorFlow操作的完整列表。另请参见this question

答案 2 :(得分:0)

也许您可以尝试将并行线程的数量设置为1。我有一个相同的问题:从第二集开始,损失变得与小数点后第七位不同。设置

时已修复
tf.ConfigProto(intra_op_parallelism_threads=1, inter_op_parallelism_threads=1)