¿Cómo imprimir el valor de un objeto Tensor en TensorFlow?

He estado usando el ejemplo introductorio de la multiplicación de matrices en TensorFlow.

matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) 

Cuando imprimo el producto, lo muestra como un objeto Tensor :

  

¿Pero cómo sé el valor del product ?

Lo siguiente no ayuda:

 print product Tensor("MatMul:0", shape=TensorShape([Dimension(1), Dimension(1)]), dtype=float32) 

Sé que los gráficos se ejecutan en Sessions , pero ¿no hay forma de que pueda verificar la salida de un objeto Tensor sin ejecutar el gráfico en una session ?

La forma más fácil [A] de evaluar el valor real de un objeto Tensor es pasarlo al método Session.run() , o llamar a Tensor.eval() cuando tiene una sesión predeterminada (es decir, en una with tf.Session(): bloque, o ver más abajo). En general [B] , no puede imprimir el valor de un tensor sin ejecutar algún código en una sesión.

Si está experimentando con el modelo de progtwigción, y desea una manera fácil de evaluar los tensores, la tf.InteractiveSession Le permite abrir una sesión al inicio de su progtwig y luego usar esa sesión para todos los Tensor.eval() (y Operation.run() ) llamadas. Esto puede ser más fácil en una configuración interactiva, como el shell o un cuaderno IPython, cuando es tedioso pasar un objeto Session cualquier lugar.

Esto puede parecer una tontería para una expresión tan pequeña, pero una de las ideas clave en Tensorflow es la ejecución diferida : es muy barato construir una expresión grande y compleja, y cuando desea evaluarla, el back-end (al que se conecta) con una Session ) puede progtwigr su ejecución de manera más eficiente (por ejemplo, ejecutando partes independientes en paralelo y utilizando GPU).


[A]: para imprimir el valor de un tensor sin devolverlo a su progtwig Python, puede usar el operador tf.Print() , como sugiere Andrzej en otra respuesta . Tenga en cuenta que aún necesita ejecutar parte del gráfico para ver la salida de esta operación, que se imprime en la salida estándar. Si está ejecutando TensorFlow distribuido, tf.Print() imprimirá su salida en la salida estándar de la tarea donde se ejecuta esa operación. Esto significa que si usa https://colab.research.google.com, por ejemplo, o cualquier otro cuaderno de Jupyter, entonces no verá la salida de tf.Print() en el cuaderno; en ese caso, consulte esta respuesta sobre cómo hacer que se imprima aún.

[B]: es posible que puedas usar la función experimental tf.contrib.util.constant_value() para obtener el valor de un tensor constante, pero no está diseñado para uso general y no está definido para muchos operadores .

Si bien otras respuestas son correctas en cuanto a que no puede imprimir el valor hasta que evalúa el gráfico, no hablan de una manera fácil de imprimir un valor dentro del gráfico, una vez que lo evalúa.

La forma más fácil de ver el valor de un tensor cada vez que se evalúa el gráfico (usando run o eval ) es usar la operación Print como en este ejemplo:

 # Initialize session import tensorflow as tf sess = tf.InteractiveSession() # Some tensor we want to print the value of a = tf.constant([1.0, 3.0]) # Add print operation a = tf.Print(a, [a], message="This is a: ") # Add more elements of the graph using a b = tf.add(a, a) 

Ahora, cada vez que evaluamos el gráfico completo, por ejemplo, usando b.eval() , obtenemos:

 I tensorflow/core/kernels/logging_ops.cc:79] This is a: [1 3] 

Reiterando lo que otros dijeron, no es posible verificar los valores sin ejecutar el gráfico.

A continuación se muestra un fragmento simple para cualquiera que busque un ejemplo fácil de imprimir valores. El código puede ser ejecutado sin ninguna modificación en el ipython notebook.

 import tensorflow as tf #define a variable to hold normal random values normal_rv = tf.Variable( tf.truncated_normal([2,3],stddev = 0.1)) #initialize the variable init_op = tf.initialize_all_variables() #run the graph with tf.Session() as sess: sess.run(init_op) #execute init_op #print the random values that we sample print (sess.run(normal_rv)) 

Salida:

 [[-0.16702934 0.07173464 -0.04512421] [-0.02265321 0.06509651 -0.01419079]] 

No, no puede ver el contenido del tensor sin ejecutar el gráfico (haciendo session.run() ). Las únicas cosas que puedes ver son:

  • la dimensionalidad del tensor (pero supongo que no es difícil calcularlo para la lista de operaciones que tiene TF)
  • tipo de operación que se utilizará para generar el tensor ( transpose_1:0 , random_uniform:0 )
  • Tipo de elementos en el tensor ( float32 ).

No he encontrado esto en la documentación, pero creo que los valores de las variables (y algunas de las constantes no se calculan en el momento de la asignación).


Echale un vistazo a éste ejemplo:

 import tensorflow as tf from datetime import datetime dim = 7000 

El primer ejemplo en el que acabo de iniciar un Tensor constante de números aleatorios que se ejecutan aproximadamente al mismo tiempo de forma irreparable ( 0:00:00.003261 )

 startTime = datetime.now() m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) print datetime.now() - startTime 

En el segundo caso, cuando la constante realmente se evalúa y los valores se asignan, el tiempo depende claramente de la 0:00:01.244642 ( 0:00:01.244642 )

 startTime = datetime.now() m1 = tf.truncated_normal([dim, dim], mean=0.0, stddev=0.02, dtype=tf.float32, seed=1) sess = tf.Session() sess.run(m1) print datetime.now() - startTime 

Y puede hacerlo más claro calculando algo ( d = tf.matrix_determinant(m1) , teniendo en cuenta que el tiempo se ejecutará en O(dim^2.8) )

PD que encontré se explica en la documentación :

Un objeto Tensor es un controlador simbólico del resultado de una operación, pero en realidad no contiene los valores de la salida de la operación.

Creo que necesitas tener algunos fundamentos correctos. Con los ejemplos anteriores ha creado tensores (matriz multidimensional). Pero para que el flujo tensor funcione realmente, debe iniciar una ” sesión ” y ejecutar su ” operación ” en la sesión. Observe la palabra “sesión” y “operación”. Necesitas saber 4 cosas para trabajar con tensorflow:

  1. tensores
  2. Operaciones
  3. Las sesiones
  4. Graficas

Ahora, por lo que escribió, le ha dado el tensor y la operación, pero no tiene una sesión ejecutándose ni un gráfico. El tensor (bordes del gráfico) fluye a través de los gráficos y se manipula mediante operaciones (nodos del gráfico). Hay gráfico predeterminado, pero puedes iniciar el tuyo en una sesión.

Cuando dice imprimir, solo tiene acceso a la forma de la variable o constante que definió.

Para que puedas ver lo que te falta:

  with tf.Session() as sess: print(sess.run(product)) print (product.eval()) 

¡Espero eso ayude!

De acuerdo con las respuestas anteriores, con su fragmento de código particular puede imprimir el producto de esta manera:

 import tensorflow as tf #Initialize the session sess = tf.InteractiveSession() matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) #print the product print(product.eval()) #close the session to release resources sess.close() 

Puede verificar la salida de un TensorObject sin ejecutar el gráfico en una sesión, habilitando la ejecución impaciente .

Simplemente agregue las siguientes dos líneas de código: import tensorflow.contrib.eager as tfe tfe.enable_eager_execution()

Justo después de import tensorflow .

La salida del producto de print product en su ejemplo ahora será: tf.Tensor([[ 12.]], shape=(1, 1), dtype=float32)

Tenga en cuenta que a partir de ahora (noviembre de 2017) tendrá que instalar una comstackción nocturna de Tensorflow para permitir una ejecución impecable. Las ruedas pre-construidas se pueden encontrar aquí .

Debe pensar que los progtwigs de TensorFlow Core constan de dos secciones diferenciadas:

  • Construyendo la gráfica computacional.
  • Ejecutando el gráfico computacional.

Así que para el código de abajo simplemente construyes el gráfico computacional.

 matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) 

También necesita Para inicializar todas las variables en un progtwig TensorFlow, debe llamar explícitamente a una operación especial de la siguiente manera:

 init = tf.global_variables_initializer() 

Ahora que construye el gráfico e inicializa todas las variables, el siguiente paso es evaluar los nodos, debe ejecutar el gráfico computacional dentro de una sesión. Una sesión encapsula el control y el estado del tiempo de ejecución de TensorFlow.

El siguiente código crea un objeto Session y luego invoca su método de ejecución para ejecutar suficiente del gráfico computacional para evaluar el product :

 sess = tf.Session() // run variables initializer sess.run(init) print(sess.run([product])) 

Tenga en cuenta que tf.Print() cambiará el nombre del tensor. Si el tensor que intenta imprimir es un marcador de posición, la alimentación de los datos fallará ya que el nombre original no se encontrará durante la alimentación. Por ejemplo:

 import tensorflow as tf tens = tf.placeholder(tf.float32,[None,2],name="placeholder") print(eval("tens")) tens = tf.Print(tens,[tens, tf.shape(tens)],summarize=10,message="tens:") print(eval("tens")) res = tens + tens sess = tf.Session() sess.run(tf.global_variables_initializer()) print(sess.run(res)) 

La salida es:

 python test.py Tensor("placeholder:0", shape=(?, 2), dtype=float32) Tensor("Print:0", shape=(?, 2), dtype=float32) Traceback (most recent call last): [...] InvalidArgumentError (see above for traceback): You must feed a value for placeholder tensor 'placeholder' with dtype float 

¡Prueba este código simple! (Es auto explicativo)

 import tensorflow as tf sess = tf.InteractiveSession() # see the answers above :) x = [[1.,2.,1.],[1.,1.,1.]] # a 2D matrix as input to softmax y = tf.nn.softmax(x) # this is the softmax function # you can have anything you like here u = y.eval() print(u) 

En el reciente Tensorflow 1.13.1

 import tensorflow as tf tf.enable_eager_execution() matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) #print the product print(product) # tf.Tensor([[12.]], shape=(1, 1), dtype=float32) print(product.numpy()) # [[12.]] 

Con Tensorflow 2.0, el modo ávido está habilitado por defecto. así que el código anterior funciona como es, pero solo necesito comentar tf.enable_eager_execution ().

No me resultó fácil entender lo que se requiere incluso después de leer todas las respuestas hasta que ejecuté esto. TensofFlow es nuevo para mí también.

 def printtest(): x = tf.constant([1.0, 3.0]) x = tf.Print(x,[x],message="Test") init = (tf.global_variables_initializer(), tf.local_variables_initializer()) b = tf.add(x, x) with tf.Session() as sess: sess.run(init) print(sess.run(b)) sess.close() 

Pero aún así es posible que necesite el valor devuelto al ejecutar la sesión.

 def printtest(): x = tf.constant([100.0]) x = tf.Print(x,[x],message="Test") init = (tf.global_variables_initializer(), tf.local_variables_initializer()) b = tf.add(x, x) with tf.Session() as sess: sess.run(init) c = sess.run(b) print(c) sess.close() 

Básicamente, en tensorflow, cuando crea un tensor de cualquier tipo, se crean y almacenan dentro, al cual se puede acceder solo cuando se ejecuta una sesión de tensorflow. Digamos que has creado un tensor constante.
c = tf.constant([[1.0, 2.0, 3.0], [4.0, 5.0, 6.0]])
Sin ejecutar una sesión, puede obtener
op : una operación. Operación que calcula este tensor.
value_index : un int. Índice del punto final de la operación que produce este tensor.
dtype : un DType. Tipo de elementos almacenados en este tensor.

Para obtener los valores, puede ejecutar una sesión con el tensor que necesita como:

 with tf.Session() as sess: print(sess.run(c)) sess.close() 

La salida será algo como esto:

array ([[1., 2., 3.], [4., 5., 6.]], dtype = float32)

 import tensorflow as tf sess = tf.InteractiveSession() x = [[1.,2.,1.],[1.,1.,1.]] y = tf.nn.softmax(x) matrix1 = tf.constant([[3., 3.]]) matrix2 = tf.constant([[2.],[2.]]) product = tf.matmul(matrix1, matrix2) print(product.eval()) tf.reset_default_graph() sess.close() 

Pregunta: ¿Cómo imprimir el valor de un objeto Tensor en TensorFlow?

Responder:

 import tensorflow as tf # Variable x = tf.Variable([[1,2,3]]) # initialize init = (tf.global_variables_initializer(), tf.local_variables_initializer()) # Create a session sess = tf.Session() # run the session sess.run(init) # print the value sess.run(x) 

En Tensorflow 2.0+ (o en un entorno en modo Eager) puede llamar .numpy() método .numpy() :

 import tensorflow as tf matrix1 = tf.constant([[3., 3.0]]) matrix2 = tf.constant([[2.0],[2.0]]) product = tf.matmul(matrix1, matrix2) print(product.numpy())