Как генерировать случайный вектор в 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)