2016-01-19 8 views
9

Sto cercando di generare una variabile casuale e usarla due volte. Tuttavia, quando lo uso la seconda volta, il generatore crea una seconda variabile casuale che non è identica alla prima. Ecco il codice per dimostrare:Come posso generare un vettore casuale in TensorFlow e mantenerlo per un ulteriore utilizzo?

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) 

voglio z1_op e z2_op essere uguali. Penso che questo sia dovuto al fatto che l'operazione random_uniform viene chiamata due volte. C'è un modo per usare TensorFlow (senza usare NumPy) per raggiungere questo obiettivo?

(Il mio caso l'uso è più complicato, ma questa è la domanda distillata.)

risposta

13

L'attuale versione del codice in modo casuale generare un nuovo valore per rand_var_1 e rand_var_2 a ogni chiamata a sess.run() (anche se da quando si imposta il seme a 0, avranno lo stesso valore all'interno di un chiamata singola a sess.run()).

Se si desidera mantenere il valore di un tensore generata a caso per un uso successivo, è necessario assegnare a un 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) 

... poi tf.initialize_all_variables() avrà l'effetto desiderato:

# 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. 
+0

Come funzionerebbe se non avessi il controllo di 'sess.run'? Lo sto utilizzando in un Estimator, quindi tutta la gestione della sessione è nascosta. La mia funzione 'g()' ha bisogno di chiamare 'f (t)' due volte, con lo stesso 't'. Comunque, ad ogni chiamata a 'g()', voglio un 't' diverso. Fondamentalmente, voglio memorizzare nella cache il risultato di 'tf.random_uniform()' per l'intera durata della mia funzione 'g()'. –

0

La tua domanda ha lo stesso problema come this question, nel senso che se si chiama random_uniform due volte si ottengono due risultati, e come tale si è necessario impostare la seconda variabile sul valore del primo. Ciò significa che, supponendo che non stanno cambiando rand_var_1 tardi, si può fare questo:

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

Ma, detto questo, se si vuole z1 e z2 essere uguali, perché avere variabili separate a tutti? Perché non fare:

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) 
+0

Avrò due risultati, ma poiché sto impostando entrambi i semi a zero, i due risultati devono essere uguali. Impostare il secondo valore sul primo non funzionerebbe per me perché nel mio caso d'uso effettivo, il secondo valore è una funzione diversa della variabile casuale. Mi scuso per il mio esempio fuorviante. Allo stesso modo, "z1_op" e "z2_op" sono diversi nel mio codice. Li stavo solo usando qui per illustrare che diversi numeri casuali vengono usati in ogni passaggio. – Distopia