Como converter um tensor em uma matriz numpy no TensorFlow?

181

Como converter um tensor em uma matriz numpy ao usar o Tensorflow com ligações Python?

mathetes
fonte

Respostas:

134

Qualquer tensor retornado por Session.runou 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.runou 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'>
Lenar Hoyt
fonte
AttributeError: o módulo 'tensorflow' não tem atributo 'Session'
Jürgen K.
77

Para converter de volta do tensor para o array numpy, basta executar .eval()no tensor transformado.

Rafał Józefowicz
fonte
5
para esclarecer: yourtensor.eval ()
mrk
12
Eu recebo 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?
Eduardo Pignatelli
@EduardoPignatelli Funciona para mim no Theano sem nenhum trabalho extra. Não tenho certeza sobre tf.
BallpointBen
5
@EduardoPignatelli você precisa executar a .eval()chamada de método dentro de uma sessão: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime
Ao utilizar este Estou recebendo erro como AttributeError: objeto 'Tensor' tem nenhum atributo 'eval'
Aakash aggarwal
72

TensorFlow 2.x

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.

cs95
fonte
2
Como fazer isso DENTRO de uma função tf.f?
mathtick
@mentalmushroom Não foi possível encontrar uma documentação, mas ela é mencionada no manual de personalizações . Mais detalhes podem ser encontrados na fonte .
Nish-ant
5
Eu recebo o seguinte erro no TF 2.0: "O objeto 'Tensor' não tem atributo 'numpy'"
Will.Evo
@ Will.Evo, é possível que você tenha desativado a execução rápida antes de executar isso. Verifique a segunda metade da minha resposta, onde você pode usar eval().
cs95 6/02
2
Não, eu não desativei a execução ansiosa. Ainda obtém AttributeError: o objeto 'Tensor' não tem atributo 'numpy'
Geoffrey Anderson
6

Você precisa:

  1. codifique o tensor da imagem em algum formato (jpeg, png) para o tensor binário
  2. avaliar (executar) o tensor binário em uma sessão
  3. vire o binário para transmitir
  4. alimentar a imagem PIL
  5. (opcional) exibir a imagem com o 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)

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
Gooshan
fonte
4

Talvez você possa tentar 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)
Lovychen
fonte
2

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 sessera obrigatório.

Meu exemplo também cobre a parte de visualização de imagens matplotlib , mas essa é a OT.

Fabiano Tarlao
fonte
1

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!

Saurabh Kumar
fonte
//não é para comentar em python. Edite sua resposta.
Vlad
0

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!

Ebin Zacharias
fonte