Respostas:
Qualquer tensor retornado por Session.run
ou eval
é um array NumPy.
>>> print(type(tf.Session().run(tf.constant([1,2,3]))))
<class 'numpy.ndarray'>
Ou:
>>> sess = tf.InteractiveSession()
>>> print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>
Ou equivalente:
>>> sess = tf.Session()
>>> with sess.as_default():
>>> print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>
EDIT: Não qualquer tensor retornado por Session.run
ou eval()
é uma matriz NumPy. Tensores esparsos, por exemplo, são retornados como SparseTensorValue:
>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>
Para converter de volta do tensor para o array numpy, basta executar .eval()
no tensor transformado.
ValueError: Cannot evaluate tensor using 'eval()': No default session is registered. Use 'with sess.as_default()' or pass an explicit session to 'eval(session=sess)'
Isso é utilizável apenas durante uma sessão de tensofluxo?
.eval()
chamada de método dentro de uma sessão: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
A Execução Ansiosa é ativada por padrão, portanto, basta chamar .numpy()
o objeto Tensor.
import tensorflow as tf
a = tf.constant([[1, 2], [3, 4]])
b = tf.add(a, 1)
a.numpy()
# array([[1, 2],
# [3, 4]], dtype=int32)
b.numpy()
# array([[2, 3],
# [4, 5]], dtype=int32)
tf.multiply(a, b).numpy()
# array([[ 2, 6],
# [12, 20]], dtype=int32)
Vale a pena notar (dos documentos),
A matriz numpy pode compartilhar memória com o objeto Tensor. Quaisquer alterações em um podem ser refletidas no outro.
Negrito ênfase minha. Uma cópia pode ou não ser devolvida, e este é um detalhe de implementação.
Se o Eager Execution estiver desativado, você poderá criar um gráfico e executá-lo atravé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)
Consulte também TF 2.0 Symbols Map para um mapeamento da API antiga para a nova.
eval()
.
Você precisa:
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)
Isso funcionou para mim. Você pode experimentá-lo em um notebook ipython. Só não se esqueça de adicionar a seguinte linha:
%matplotlib inline
Eu enfrentei e resolvi a conversão tensor-> ndarray no caso específico de tensores representando imagens (adversárias), obtidos com a biblioteca / tutoriais da cleverhans .
Penso que a minha pergunta / resposta ( aqui ) pode ser um exemplo útil também para outros casos.
Eu sou novo no TensorFlow, a minha é uma conclusão empírica:
Parece que o método tensor.eval () pode precisar, para ter sucesso, também o valor para os marcadores de entrada . O tensor pode funcionar como uma função que precisa de seus valores de entrada (fornecidos em feed_dict
) para retornar um valor de saída, por exemplo
array_out = tensor.eval(session=sess, feed_dict={x: x_input})
Observe que o nome do espaço reservado é x no meu caso, mas acho que você deve descobrir o nome correto para o espaço reservado de entrada .
x_input
é um valor escalar ou matriz que contém dados de entrada.
No meu caso, o fornecimento também sess
era obrigatório.
Meu exemplo também cobre a parte de visualização de imagens matplotlib , mas essa é a OT.
Um exemplo simples pode 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 agora, se quisermos que esse tensor a seja convertido em uma matriz numpy
a_np=a.eval()
print(type(a_np))
#<class 'numpy.ndarray'>
Tão simples como isso!
//
não é para comentar em python. Edite sua resposta.
Eu estava procurando por dias para este comando.
Isso funcionou para mim fora de qualquer sessão ou algo assim.
# you get an array = your tensor.eval(session=tf.compat.v1.Session())
an_array = a_tensor.eval(session=tf.compat.v1.Session())
https://kite.com/python/answers/how-to-convert-a-tensorflow-tensor-to-a-numpy-array-in-python
Você pode usar a função de back-end do keras.
import tensorflow as tf
from tensorflow.python.keras import backend
sess = backend.get_session()
array = sess.run(< Tensor >)
print(type(array))
<class 'numpy.ndarray'>
Espero que ajude!