我正在以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
但是,每次运行程序都会得到不同的结果(无需更改任何代码)。为什么结果不一致,为什么要获得相同的结果该怎么办?
我能想到的唯一可能引入随机性的地方(除了神经网络)是
tf.truncated_normal
生成随机噪声epsilon
,以实现噪声层np.random.uniform
从重播缓冲区中随机选择样本我还发现,我获得的分数在前10集中相当一致,但随后开始有所不同。诸如损失之类的其他事物也显示出相似的趋势,但数值上却不同。
我还设置了“ PYTHONHASHSEED”并使用@ jaypops96所述的单线程CPU,但仍然无法重现结果。上面的代码块中的代码已更新
答案 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)