2015-11-09 11 views

risposta

154

Se si dispone di un Tensor t, chiamare t.eval() equivale a chiamare tf.get_default_session().run(t).

È possibile effettuare una sessione di default come segue:

t = tf.constant(42.0) 
sess = tf.Session() 
with sess.as_default(): # or `with sess:` to close on exit 
    assert sess is tf.get_default_session() 
    assert t.eval() == sess.run(t) 

La differenza più importante è che è possibile utilizzare sess.run() per recuperare i valori di molte tensori nello stesso punto:

t = tf.constant(42.0) 
u = tf.constant(37.0) 
tu = tf.mul(t, u) 
ut = tf.mul(u, t) 
with sess.as_default(): 
    tu.eval() # runs one step 
    ut.eval() # runs one step 
    sess.run([tu, ut]) # evaluates both tensors in a single step 

Si noti che ogni chiamata a eval e run eseguirà l'intero grafico da zero. Per memorizzare nella cache il risultato di un calcolo, assegnarlo a tf.Variable.

+2

E 'in qualche modo possibile alimentare un segnaposto? ([la mia domanda] (http://stackoverflow.com/questions/33810990/how-to-feed-a-placeholder)) – displayname

+0

qual è il diverso nel secondo esempio? È solo che puoi valutare di separare le operazioni (o i grafici? Non sei sicuro di quale sia la differenza)? – Pinocchio

+1

wait, il tuo esempio viene effettivamente eseguito? Ho provato: 'a = tf.constant (2.0) b = tf.constant (3.0) ab = tf.matmul (a, b)' e ho appena ricevuto lamentele da parte di tensorflow che le forme non corrispondono, credo più precisamente, che il grado deve essere almeno 2. – Pinocchio

28

La sessione FAQ sul flusso del tensore ha un answer to exactly the same question. Vorrei solo andare avanti e lo lascio qui:


Se t è un oggetto Tensor, t.eval() è una scorciatoia per sess.run(t) (dove sess è la sessione di default corrente I due seguenti frammenti di codice sono equivalenti:.

Nel secondo esempio, la sessione funge da gestore contesto, che ha l'effetto di installarlo come sessione predefinita per la durata del blocco con. L'approccio del gestore di contesto può portare a codice più conciso per casi di utilizzo semplice (come i test unitari), se il tuo codice tratta l'arguzia h più grafici e sessioni, può essere più semplice per le chiamate esplicite a Session.run().

Ti consiglio di scremare almeno l'intera FAQ, in quanto potrebbe chiarire un sacco di cose.

1

eval() non in grado di gestire l'oggetto elenco

tf.reset_default_graph() 

a = tf.Variable(0.2, name="a") 
b = tf.Variable(0.3, name="b") 
z = tf.constant(0.0, name="z0") 
for i in range(100): 
    z=a*tf.cos(z+i)+z*tf.sin(b-i) 
grad=tf.gradients(z,[a,b]) 

init=tf.global_variables_initializer() 

with tf.Session() as sess: 
    init.run() 
    print("z:",z.eval()) 
    print("grad",grad.eval()) 

ma Session.run() può

print("grad",sess.run(grad)) 

mi corregga se sbaglio