如何在 TensorFlow 中生成随机向量并维护它以供进一步使用?
How do I generate a random vector in TensorFlow and maintain it for further use?
我正在尝试生成一个随机变量并使用它两次。但是,当我第二次使用它时,生成器创建了第二个与第一个不相同的随机变量。这是演示代码:
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_op
和 z2_op
相等。我认为这是因为 random_uniform
操作被调用了两次。有没有办法使用 TensorFlow(不使用 NumPy)来实现这一点?
(我的用例更复杂,但这是提炼出来的问题。)
您的问题与 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
但是,也就是说,如果您希望 z1
和 z2
相等,为什么要有单独的变量呢?为什么不这样做:
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)
您的代码的当前版本将在每次调用 sess.run()
时为 rand_var_1
和 rand_var_2
随机生成一个新值(尽管由于您将种子设置为 0,它们将在对 sess.run()
).
的单次调用中具有相同的值
如果要保留 randomly-generated 张量的值供以后使用,应将其分配给 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.
我正在尝试生成一个随机变量并使用它两次。但是,当我第二次使用它时,生成器创建了第二个与第一个不相同的随机变量。这是演示代码:
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_op
和 z2_op
相等。我认为这是因为 random_uniform
操作被调用了两次。有没有办法使用 TensorFlow(不使用 NumPy)来实现这一点?
(我的用例更复杂,但这是提炼出来的问题。)
您的问题与 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
但是,也就是说,如果您希望 z1
和 z2
相等,为什么要有单独的变量呢?为什么不这样做:
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)
您的代码的当前版本将在每次调用 sess.run()
时为 rand_var_1
和 rand_var_2
随机生成一个新值(尽管由于您将种子设置为 0,它们将在对 sess.run()
).
如果要保留 randomly-generated 张量的值供以后使用,应将其分配给 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.