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

204

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

Geoffrey Irving
fuente
espacio de nombres completo tf.Tensor.eval()y tf.Session.run(), pero están conectados tf.Operation.run()y tf.Tensor.eval()como se explica aquí
prosti

Respuestas:

243

Si tiene una Tensort, llamar t.eval()es equivalente a llamar 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 evaly runejecutará todo el gráfico desde cero. Para almacenar en caché el resultado de un cálculo, asígnelo a a tf.Variable.

señor
fuente
¿Cuál es la diferencia en el segundo ejemplo? ¿Es solo que puede evaluar para separar operaciones (o gráficos? No está seguro de cuál es la diferencia)?
Pinocho
1
espera, ¿tu ejemplo realmente funciona? Lo intenté: a = tf.constant(2.0) b = tf.constant(3.0) ab = tf.matmul(a, b) y recibí quejas de Tensorflow de que las formas no coinciden, supongo que más precisamente, que el rango debe ser al menos 2.
Pinocho
@Pinocchio Creo que la API cambió ya que la respuesta original se publicó hace 4 años. Solía tf.multiply(t, u)y funcionó bien.
yuqli
42

La sesión de preguntas frecuentes sobre el flujo del tensor tiene una respuesta exactamente a la misma pregunta . Seguiré adelante y lo dejaré aquí:


Si tes un Tensorobjeto, es una t.eval()forma abreviada de sess.run(t)(donde sessestá 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 administrador de contexto, lo que tiene el efecto de instalarla como la sesión predeterminada durante la vida útil del withbloque. El enfoque del administrador de contexto puede conducir 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 Session.run().

Le recomiendo que al menos lea las preguntas frecuentes completas, ya que podría aclarar muchas cosas.

Salvador Dalí
fuente
2

eval() no puede manejar el objeto de la lista

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

Yushin Liu
fuente
1

Lo más importante para recordar:

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

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

Ambos tf.Session.run()y tf.Tensor.eval()obtener resultados de la sesión donde tf.Tensor.eval()hay un atajo para llamartf.get_default_session().run(t)


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

Una vez que se ha lanzado el gráfico en una sesión, se puede ejecutar una Operación pasándola a tf.Session.run(). op.run()es un atajo para llamar tf.get_default_session().run(op).

prosti
fuente
0

En tensorflow, crea gráficos y pasa valores a ese gráfico. Graph hace todo el trabajo duro y genera la salida en función de 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 inicializa la sesión, se supone que debe usar esa sesión porque todas las variables y configuraciones ahora son 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 usa la sesión que se está ejecutando.

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

tf.get_default_session().run(values)

Puedes comprobarlo tú mismo. En el lugar de la values.eval()carrera 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 ().

Sudeep K Rana
fuente
0

Respuesta compatible con Tensorflow 2.x : Convertir el código de mrry Tensorflow 2.x (>= 2.0)en beneficio de la comunidad.

!pip install tensorflow==2.1
import tensorflow as tf

tf.compat.v1.disable_eager_execution()    

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

#The most important difference is that you can use sess.run() to fetch the values of many tensors in the same step:

t = tf.constant(42.0)
u = tf.constant(37.0)
tu = tf.multiply(t, u)
ut = tf.multiply(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
Soporte Tensorflow
fuente