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

Tensorflow: Different results with the same random seed

我正在 运行 在健身房环境 (BipedalWalker-v2) 中使用 tensorflow 实施强化学习程序。我手动设置了环境的随机种子,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 从回放缓冲区中随机 select 个样本

我还发现我得到的分数在前 10 集中非常一致,但随后开始不同。其他如损失也有类似的趋势,但在数字上并不相同。

更新 2

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

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

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

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

他们的关键是为 numpy、python 和 tensorflow 预先设置随机种子值,然后还专门在单线程 CPU 上制作 tensorflow 运行 -配置的会话。

这是我使用的代码,与我发布的 link 相比略有更新。

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。我有同样的问题:从第二集开始损失变得不在小数点后第七位。它在我设置

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

我建议检查您的 TensorFlow 图是否包含非确定性操作。例如,TensorFlow 1.2 之前的 reduce_sum 就是这样一种操作。这些操作是不确定的,因为浮点加法和乘法是非关联的(浮点数相加或相乘的顺序会影响结果)并且因为此类操作不能保证它们的输入每次都以相同的顺序相加或相乘.另见 .

编辑(2020 年 9 月 20 日):GitHub 存储库 framework-determinism 包含有关机器学习框架(尤其是 TensorFlow)中不确定性来源的更多信息。