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?
fuente
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 una Tensor
t, 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 eval
y run
ejecutará todo el gráfico desde cero. Para almacenar en caché el resultado de un cálculo, asígnelo a a tf.Variable
.
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.
tf.multiply(t, u)
y funcionó bien.
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 t
es un Tensor
objeto, es una t.eval()
forma abreviada de sess.run(t)
(donde sess
está 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 with
bloque. 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.
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
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()
ytf.Tensor.eval()
obtener resultados de la sesión dondetf.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 llamartf.get_default_session().run(op)
.
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 ().
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
tf.Tensor.eval()
ytf.Session.run()
, pero están conectadostf.Operation.run()
ytf.Tensor.eval()
como se explica aquí