En TensorFlow, ¿cuál es la diferencia entre Session.run () y Tensor.eval ()?

TensorFlow tiene dos formas de evaluar parte del gráfico: Session.run en una lista de variables y Tensor.eval . ¿Hay alguna diferencia entre estos dos?

Si tiene un Tensor t, llamar a t.eval() es equivalente a llamar a tf.get_default_session().run(t) .

Puede hacer que una sesión sea la predeterminada de la siguiente manera:

 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 diferencia más importante es que puede usar sess.run() para obtener los valores de muchos tensores en el mismo paso:

 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 

Tenga en cuenta que cada llamada a eval y run ejecutará todo el gráfico desde cero. Para almacenar en caché el resultado de un cálculo, asignarlo a una tf.Variable .

La sesión de preguntas frecuentes sobre el flujo tensorial tiene una respuesta a la misma pregunta . Voy a seguir adelante y dejarlo aquí:


Si t es un objeto Tensor , t.eval() es una abreviatura de sess.run(t) (donde sess es la sesión predeterminada actual. Los dos fragmentos de código siguientes son equivalentes:

 sess = tf.Session() c = tf.constant(5.0) print sess.run(c) c = tf.constant(5.0) with tf.Session(): print c.eval() 

En el segundo ejemplo, la sesión actúa como un administrador de contexto, lo que tiene el efecto de instalarlo como la sesión predeterminada durante la vida útil del bloque with . El enfoque del administrador de contexto puede llevar a un código más conciso para casos de uso simples (como pruebas unitarias); Si su código trata con múltiples gráficos y sesiones, puede ser más sencillo hacer llamadas explícitas a Session.run() .

Le recomendaría que al menos hojee todas las preguntas frecuentes, ya que podría aclarar muchas cosas.

eval() no puede manejar la lista de objetos

 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()) 

pero Session.run() puede

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

corrígeme si estoy equivocado

En tensorflow creas gráficos y pasas valores a ese gráfico. Graph hace todo el trabajo duro y genera el resultado basado en la configuración que ha realizado en el gráfico. Ahora, cuando pasa valores al gráfico, primero debe crear una sesión de tensorflow.

 tf.Session() 

Una vez que se inicia la sesión, se supone que debe usar esa sesión porque todas las variables y configuraciones ahora forman parte de la sesión. Por lo tanto, hay dos formas de pasar valores externos al gráfico para que el gráfico los acepte. Una es llamar a .run () mientras está usando la sesión que se está ejecutando.

Otra forma que es básicamente un atajo a esto es usar .eval (). Dije atajo porque la forma completa de .eval () es

 tf.get_default_session().run(values) 

Puedes comprobarlo tú mismo. En el lugar de values.eval() ejecute tf.get_default_session().run(values) . Debes tener el mismo comportamiento.

lo que eval está haciendo es usar la sesión predeterminada y luego ejecutar run ().

Lo más importante para recordar:

La única manera de obtener una constante, variable (cualquier resultado) de TenorFlow es la sesión.

Sabiendo esto todo lo demás es fácil :

Tanto tf.Session.run() como tf.Tensor.eval() obtienen resultados de la sesión donde tf.Tensor.eval() es un acceso directo para llamar a tf.get_default_session().run(t)


También me gustaría describir el método tf.Operation.run() como aquí :

Después de que el gráfico se haya iniciado en una sesión, se puede ejecutar una Operación pasándola a tf.Session.run() . op.run() es un acceso directo para llamar a tf.get_default_session().run(op) .