python - framework - ¿Cómo puedo convertir un tensor en una matriz numpy en TensorFlow?
tensor to numpy array keras (7)
¿Cómo convertir un tensor en una matriz numpy cuando se usa Tensorflow con enlaces de Python?
TensorFlow 2.0
Eager Execution
está habilitada de manera predeterminada, así que solo llame a
.numpy()
en el objeto Tensor.
import tensorflow as tf
a = tf.constant([[1, 2], [3, 4]])
b = tf.add(a, 1)
tf.multiply(a, b).numpy()
# array([[ 2, 6],
# [12, 20]], dtype=int32)
Vale la pena señalar (de los documentos),
Numpy array puede compartir memoria con el objeto Tensor. Cualquier cambio en uno puede reflejarse en el otro.
El énfasis audaz es mío. Una copia puede o no ser devuelta, y este es un detalle de implementación.
Si Eager Execution está deshabilitado, puede crear un gráfico y luego ejecutarlo a través de
tf.compat.v1.Session
.
a = tf.constant([[1, 2], [3, 4]])
b = tf.add(a, 1)
out = tf.multiply(a, b)
out.eval(session=tf.compat.v1.Session())
# array([[ 2, 6],
# [12, 20]], dtype=int32)
Ver también TF 2.0 Symbols Map para una asignación de la API antigua a la nueva.
Cualquier tensor devuelto por
Session.run
o
eval
es una matriz NumPy.
>>> print(type(tf.Session().run(tf.constant([1,2,3]))))
<class ''numpy.ndarray''>
O:
>>> sess = tf.InteractiveSession()
>>> print(type(tf.constant([1,2,3]).eval()))
<class ''numpy.ndarray''>
O equivalente:
>>> sess = tf.Session()
>>> with sess.as_default():
>>> print(type(tf.constant([1,2,3]).eval()))
<class ''numpy.ndarray''>
EDITAR:
ningún
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]))))
<class ''tensorflow.python.framework.sparse_tensor.SparseTensorValue''>
He enfrentado y resuelto la conversión de tensor-> ndarray en el caso específico de los tensores que representan imágenes (adversarias), obtenidas con la biblioteca / tutoriales de cleverhans .
Creo que mi pregunta / respuesta ( here ) puede ser un ejemplo útil también para otros casos.
Soy nuevo con TensorFlow, el mío 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.
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 era obligatorio proporcionar
sess
.
Mi ejemplo también cubre la parte de visualización de imágenes matplotlib , pero esto es OT.
Necesitas:
- codificar el tensor de imagen en algún formato (jpeg, png) a tensor binario
- evaluar (ejecutar) el tensor binario en una sesión
- convertir el binario para transmitir
- alimentar a la imagen PIL
- (opcional) muestra la imagen con matplotlib
Código:
import tensorflow as tf
import matplotlib.pyplot as plt
import PIL
...
image_tensor = <your decoded 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 de ipython. Simplemente no olvide agregar la siguiente línea:
%matplotlib inline
Para volver a convertir de tensor a matriz numpy, simplemente puede ejecutar
.eval()
en el tensor transformado.
Quizás puedas 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)
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))
#<class ''tensorflow.python.framework.ops.Tensor''>
tf.InteractiveSession() # run an interactive session in Tf.
n ahora si queremos que este tensor a se convierta en una matriz numpy
a_np=a.eval()
print(type(a_np))
#<class ''numpy.ndarray''>
¡Tan sencillo como eso!