Как генерировать случайный вектор в 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_op
и z2_op
должны быть равны. Я думаю, это потому, что random_uniform
op вызывается дважды. Есть ли способ использовать TensorFlow (без использования NumPy) для достижения этого?
(мой вариант использования более сложный, но это дистиллированный вопрос.)
2 ответов
текущая версия вашего кода будет случайным образом генерировать новое значение для rand_var_1
и rand_var_2
при каждом вызове sess.run()
(хотя, поскольку вы установили seed в 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.
ваш вопрос имеет ту же проблему, что и этот вопрос, в том случае, если вы позвоните 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)