Python 使用张量设置特定种子?
我想用一些随机值构建一个图。然后我想用不同的种子来计算这个图。以下是我试图实现的一个示例:Python 使用张量设置特定种子?,python,tensorflow,Python,Tensorflow,我想用一些随机值构建一个图。然后我想用不同的种子来计算这个图。以下是我试图实现的一个示例: import tensorflow as tf seed = tf.placeholder(dtype=tf.int32, shape=(), name="seed") randoms = tf.random_normal(shape=[8], seed=seed) 然后我希望这样做,前两个调用将返回相同的结果: sess = tf.InteractiveSession() sess.run(rando
import tensorflow as tf
seed = tf.placeholder(dtype=tf.int32, shape=(), name="seed")
randoms = tf.random_normal(shape=[8], seed=seed)
然后我希望这样做,前两个调用将返回相同的结果:
sess = tf.InteractiveSession()
sess.run(randoms, {seed: 1})
sess.run(randoms, {seed: 1})
sess.run(randoms, {seed: 2})
有什么办法解决这个问题吗?这可以用
例如:
import tensorflow as tf
seed = tf.placeholder(dtype=tf.int32, shape=[2], name="seed")
randoms = tf.random.stateless_normal(shape=[3], seed=seed)
sess = tf.InteractiveSession()
print(sess.run(randoms, {seed: [1, 0]}))
print(sess.run(randoms, {seed: [1, 0]}))
print(sess.run(randoms, {seed: [2, 0]}))
但是,文档中的警告注释: 在同一硬件上(以及CPU和GPU之间)的多个运行中,输出是一致的,但在TensorFlow版本之间或在非CPU/GPU硬件上可能会发生变化
随机操作有一个内部随机数生成器,该生成器在创建会话时初始化。TensorFlow需要知道具体的种子值,因此,这些必须是原始Python数,它们不能是稍后计算的张量。据我所知,(目前)没有办法在同一个会话内的随机操作中重新初始化随机数生成器。如果你真的需要这个能力,你可以在C++中实现你自己的随机操作,虽然这是一个不平凡的工作(见)。为什么我只是一个需要这个的人。在许多应用中,在服务时间内,结果需要某种程度上是随机的(探索),但这种随机性需要控制(例如,由客户控制)。在tensorflow之外生成随机数,然后将它们输入到模型中,这让人感到不可思议的愚蠢。但目前这似乎是唯一的办法?除非我用C++来做一些不平凡的工作,否则你会提到:(好的,你可以使用多个种子,但你需要不同的图表,而不仅仅是不同的会话。随机操作使用两个种子,在创建操作时固定,即使你调用
tf。设置\u Random\u seed
以后,上一个操作将不会更改种子。例如,对于tf.Random\u normal
的输出,请选中Random.op.inputs[0].op.inputs[0].op.get_attr('seed')
和random.op.inputs[0].op.inputs[0].op.get_attr('seed2')
(默认情况下,图形种子和op种子,0
,表示随机种子,请参见)。这些都不能更改。tf.contrib.stateless模块的存在正是为了实现这一目的:
[ 0.1266503 -0.49301657 0.6311907 ]
[ 0.1266503 -0.49301657 0.6311907 ]
[-0.6394294 -0.18700573 -0.82845527]