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

11

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

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操作被调用了两次。有没有一种方法可以使用TensorFlow(而不使用NumPy)来实现这一点?

(我的用例更加复杂,但这是精简后的问题。)

2个回答

15

你当前的代码版本将在每次调用 sess.run() 时随机生成 rand_var_1rand_var_2 的新值(尽管由于您将种子设置为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.

如果我无法控制sess.run,这将如何工作?我正在Estimator中使用它,因此所有会话管理都是隐藏的。我的函数g()需要两次调用具有相同tf(t)。但是,在每次调用g()时,我希望有一个不同的t。基本上,我想为整个函数g()的持续时间缓存tf.random_uniform()的结果。 - Ciprian Tomoiagă
@CiprianTomoiagă:如果您还没有这样做,请提出一个新问题。 - Peter O.
有道理。我想我已经弄明白了。假期结束后,我会写一个问答总结。谢谢! - Ciprian Tomoiagă

0

你的问题与这个问题相同,如果你调用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)

我将得到两个结果,但由于我将两个种子都设置为零,所以这两个结果必须相同。将第二个值设置为第一个值对我来说行不通,因为在我的实际用例中,第二个值是随机变量的不同函数。对于我误导性的示例,我深表歉意。同样,在我的代码中,“z1_op”和“z2_op”是不同的。我只是在这里使用它们来说明每个步骤中使用了不同的随机数。 - Srikiran

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接