¿Cómo puedo convertir un tensor en una matriz numpy en TensorFlow?

¿Cómo convertir un tensor en una matriz numpy cuando se utiliza Tensorflow con enlaces Python?

Cualquier tensor devuelto por Session.run o eval es una matriz NumPy.

 >>> print(type(tf.Session().run(tf.constant([1,2,3]))))  

O:

 >>> sess = tf.InteractiveSession() >>> print(type(tf.constant([1,2,3]).eval()))  

O equivalente:

 >>> sess = tf.Session() >>> with sess.as_default(): >>> print(type(tf.constant([1,2,3]).eval()))  

EDITAR: No cualquier tensor devuelto por Session.run o eval() es una matriz NumPy. Los tensores dispersos, por ejemplo, se devuelven como SparseTensorValue:

 >>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))  

Para volver a convertir de tensor a numpy array, simplemente puede ejecutar .eval() en el tensor transformado.

Necesitas:

  1. codifique el tensor de la imagen en algún formato (jpeg, png) al tensor binario
  2. evaluar (ejecutar) el tensor binario en una sesión
  3. girar el binario para transmitir
  4. alimentar a la imagen PIL
  5. (opcional) mostrar la imagen con matplotlib

Código:

 import tensorflow as tf import matplotlib.pyplot as plt import PIL ... image_tensor =  jpeg_bin_tensor = tf.image.encode_jpeg(image_tensor) with tf.Session() as sess: # display encoded back to image data jpeg_bin = sess.run(jpeg_bin_tensor) jpeg_str = StringIO.StringIO(jpeg_bin) jpeg_image = PIL.Image.open(jpeg_str) plt.imshow(jpeg_image) 

Esto funcionó para mí. Puedes probarlo en un cuaderno ipython. No olvides añadir la siguiente línea:

 %matplotlib inline 

Tal vez usted puede probar, este método:

 import tensorflow as tf W1 = tf.Variable(tf.random_uniform([1], -1.0, 1.0)) init = tf.global_variables_initializer() sess = tf.Session() sess.run(init) array = W1.eval(sess) print (array) 

He enfrentado y resuelto la conversión tensor-> ndarray en el caso específico de tensores que representan imágenes (adversariales), obtenidos con la biblioteca / tutoriales de Cleverhans .

Creo que mi pregunta / respuesta ( aquí ) puede ser un ejemplo útil también para otros casos.

Soy nuevo en TensorFlow, la mía es una conclusión empírica:

Parece que el método tensor.eval () puede necesitar, para tener éxito, también el valor de los marcadores de posición de entrada. El tensor puede funcionar como una función que necesita sus valores de entrada (proporcionados en feed_dict ) para devolver un valor de salida, por ejemplo

 array_out = tensor.eval(session=sess, feed_dict={x: x_input}) 

Tenga en cuenta que el nombre del marcador de posición es x en mi caso, pero supongo que debe encontrar el nombre correcto para el marcador de posición de entrada. x_input es un valor escalar o matriz que contiene datos de entrada.

En mi caso también fue obligatorio el sess .

Mi ejemplo también cubre la parte de visualización de imágenes de matplotlib , pero esto es OT.

Un ejemplo simple podría ser,

  import tensorflow as tf import numpy as np a=tf.random_normal([2,3],0.0,1.0,dtype=tf.float32) #sampling from a std normal print(type(a)) # tf.InteractiveSession() # run an interactive session in Tf. 

n ahora si queremos que este tensor se convierta en una matriz numpy

  a_np=a.eval() print(type(a_np)) # 

¡Tan sencillo como eso!