Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/tensorflow/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 使用张量设置特定种子?_Python_Tensorflow - Fatal编程技术网

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]