TensorFlow ha due modi per valutare parte del grafico: Session.run
in un elenco di variabili e Tensor.eval
. C'è una differenza tra questi due?In TensorFlow, qual è la differenza tra Session.run() e Tensor.eval()?
risposta
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
.
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.
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
E 'in qualche modo possibile alimentare un segnaposto? ([la mia domanda] (http://stackoverflow.com/questions/33810990/how-to-feed-a-placeholder)) – displayname
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
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