6

In ipython ho importato tensorflow as tf e numpy as np e creato un TensorFlow InteractiveSession. Quando sto facendo funzionare o l'inizializzazione qualche distribuzione normale con ingresso NumPy, tutto funziona bene:TensorFlow: generazione di una costante casuale

some_test = tf.constant(np.random.normal(loc=0.0, scale=1.0, size=(2, 2))) 
session.run(some_test) 

Returns:

array([[-0.04152317, 0.19786302], 
     [-0.68232622, -0.23439092]]) 

proprio come previsto.

... ma quando uso la normale funzione di distribuzione tensorflow:

some_test = tf.constant(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32)) 
session.run(some_test) 

... solleva un errore di tipo dicendo:

(...) 
TypeError: List of Tensors when single Tensor expected 

Che cosa mi manca qui?

L'uscita:

sess.run(tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32)) 

solo restituisce la stessa cosa esatta che np.random.normal genera -> una matrice di forma (2, 2) con valori presi da una distribuzione normale.

risposta

8

Il tf.constant() op prende una matrice numpy (o qualcosa implicitamente convertibile in una matrice numpy) e restituisce uno tf.Tensor il cui valore è lo stesso di quella matrice. Lo standard non accetta un argomento come tf.Tensor.

D'altra parte, l'tf.random_normal() op restituisce un valore tf.Tensor il cui valore viene generato in modo casuale in base alla distribuzione fornita ogni volta che viene eseguito. Poiché restituisce un valore tf.Tensor, non può essere utilizzato come argomento su tf.constant(). Questo spiega TypeError (che non è correlato all'uso di tf.InteractiveSession, poiché si verifica quando si crea il grafico).

Suppongo che tu voglia che il tuo grafico includa un tensore che (i) sia generato casualmente al suo primo utilizzo, e (ii) costante da allora in poi. Ci sono due modi per farlo:

  1. Usa NumPy per generare il valore casuale e metterlo in un tf.constant(), come avete fatto nella vostra domanda:

    some_test = tf.constant(
        np.random.normal(loc=0.0, scale=1.0, size=(2, 2)).astype(np.float32)) 
    
  2. (potenzialmente più veloce, in quanto possono utilizzare la GPU per generare i numeri casuali) Uso tensorflow per generare il valore casuale e metterlo in un tf.Variable:

    some_test = tf.Variable(
        tf.random_normal([2, 2], mean=0.0, stddev=1.0, dtype=tf.float32) 
    sess.run(some_test.initializer) # Must run this before using `some_test` 
    
+2

Grazie per la spiegazione! Quindi devo usare 'tf.Variable 'quando voglio l'accelerazione della GPU o il" flusso "puro per ottenere una" costante "casuale ?! – daniel451

+0

Sì, è controintuitivo, non è vero? :) Il problema è in realtà che, in TF, i concetti di "è variabile" e "è inizializzabile" sono combinati nello stesso tipo - abbiamo occasionalmente discusso modi migliori per fare l'inizializzazione (ad esempio alcuni equivalenti dell'inizializzazione statica in C- come le lingue), ma non si sono ancora risolti in un progetto.(Si potrebbe immaginare come una cosa del genere sarebbe utile per le ottimizzazioni come il piegamento costante, ecc.) – mrry

+1

Grazie per la risposta @mrry. Se sto cercando di fare la stessa cosa ma non voglio mantenere la costante 'some_test', farei la stessa cosa dell'opzione 2 ma non includerò' sess.run (some_test.initializer) '? – bnorm