如何在TensorFlow中生成随机向量并将其保留以供进一步使用?

时间:2016-01-19 22:33:07

标签: python random tensorflow

我正在尝试生成一个随机变量并使用它两次。但是,当我第二次使用它时,生成器会创建第二个与第一个不同的随机变量。以下是演示代码:

import numpy as np
import tensorflow as tf

# A random variable
rand_var_1 = tf.random_uniform([5],0,10, dtype = tf.int32, seed = 0)
rand_var_2 = tf.random_uniform([5],0,10, dtype = tf.int32, seed = 0)

#Op1
z1 = tf.add(rand_var_1,rand_var_2)

#Op2
z2 = tf.add(rand_var_1,rand_var_2)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    z1_op = sess.run(z1)
    z2_op = sess.run(z2)
    print(z1_op,z2_op)

我希望z1_opz2_op相等。我认为这是因为random_uniform op被调用了两次。有没有办法使用TensorFlow(不使用NumPy)来实现这一目标?

(我的用例更复杂,但这是一个提炼的问题。)

2 个答案:

答案 0 :(得分:14)

当前版本的代码会在每次调用rand_var_1时随机生成rand_var_2sess.run()的新值(尽管由于您将种子设置为0,因此他们将拥有在sess.run()}的单次调用中,该值相同。

如果要保留随机生成的张量的值以供以后使用,则应将其分配给tf.Variable

rand_var_1 = tf.Variable(tf.random_uniform([5], 0, 10, dtype=tf.int32, seed=0))
rand_var_2 = tf.Variable(tf.random_uniform([5], 0, 10, dtype=tf.int32, seed=0))

# Or, alternatively:
rand_var_1 = tf.Variable(tf.random_uniform([5], 0, 10, dtype=tf.int32, seed=0))
rand_var_2 = tf.Variable(rand_var_1.initialized_value())

# Or, alternatively:
rand_t = tf.random_uniform([5], 0, 10, dtype=tf.int32, seed=0)
rand_var_1 = tf.Variable(rand_t)
rand_var_2 = tf.Variable(rand_t)

...然后tf.initialize_all_variables()将产生预期效果:

# Op 1
z1 = tf.add(rand_var_1, rand_var_2)

# Op 2
z2 = tf.add(rand_var_1, rand_var_2)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)        # Random numbers generated here and cached.
    z1_op = sess.run(z1)  # Reuses cached values for rand_var_1, rand_var_2.
    z2_op = sess.run(z2)  # Reuses cached values for rand_var_1, rand_var_2.
    print(z1_op, z2_op)   # Will print two identical vectors.

答案 1 :(得分:0)

您的问题与this question有同样的问题,因为如果您拨打random_uniform两次,您将获得两个结果,因此您需要将第二个变量设置为第一个变量。这意味着,假设您之后没有更改rand_var_1,您可以这样做:

rand_var_1 = tf.random_uniform([5],0,10, dtype = tf.int32, seed = 0)
rand_var_2 = rand_var_1

但是,如果你希望z1z2相等,为什么要有单独的变量呢?为什么不这样做:

import numpy as np
import tensorflow as tf

# A random variable
rand_var = tf.random_uniform([5],0,10, dtype = tf.int32, seed = 0)
op = tf.add(rand_var,rand_var)

init = tf.initialize_all_variables()

with tf.Session() as sess:
    sess.run(init)
    z1_op = sess.run(op)
    z2_op = sess.run(op)
    print(z1_op,z2_op)