Jak przekonwertować tensor na tablicę numpy w TensorFlow?

181

Jak przekonwertować tensor na tablicę numpy, używając Tensorflow z powiązaniami Pythona?

mateci
źródło

Odpowiedzi:

134

Każdy tensor zwrócony przez tablicę NumPy Session.runlub evaljest tablicą.

>>> print(type(tf.Session().run(tf.constant([1,2,3]))))
<class 'numpy.ndarray'>

Lub:

>>> sess = tf.InteractiveSession()
>>> print(type(tf.constant([1,2,3]).eval()))
<class 'numpy.ndarray'>

Lub równoważnie:

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

EDIT: Nie każdy tensor zwrócony przez Session.runlub eval()jest tablicą NumPy. Na przykład rzadkie tensory są zwracane jako SparseTensorValue:

>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>
Lenar Hoyt
źródło
AttributeError: moduł „tensorflow” nie ma atrybutu „Session”
Jürgen K.
77

Aby przekonwertować z powrotem z tablicy tensor do numpy, możesz po prostu uruchomić .eval()przekształcony tensor.

Rafał Józefowicz
źródło
5
wyjaśnienie: yourtensor.eval ()
mrk
12
Otrzymuję 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)'Czy można to wykorzystać tylko podczas sesji tensoflow?
Eduardo Pignatelli
@EduardoPignatelli Działa u mnie w Theano bez dodatkowej pracy. Nie jestem pewien co do tf.
BallpointBen
5
@EduardoPignatelli musisz uruchomić .eval()wywołanie metody z poziomu sesji: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime
Używając tego, otrzymuję błąd jako AttributeError: Obiekt „Tensor” nie ma atrybutu „eval”
Aakash aggarwal
73

TensorFlow 2.x

Zachłanne wykonywanie jest domyślnie włączone, więc po prostu wywołaj .numpy()obiekt 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)

Warto zwrócić uwagę (na podstawie dokumentacji),

Tablica Numpy może współdzielić pamięć z obiektem Tensor. Wszelkie zmiany jednej z nich mogą znaleźć odzwierciedlenie w drugiej.

Odważne podkreślenie moje. Kopia może zostać zwrócona lub nie, i jest to szczegół implementacji.


Jeśli Eager Execution jest wyłączone, możesz zbudować wykres, a następnie przeprowadzić go przez 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)

Zobacz także Mapa symboli TF 2.0, aby zobaczyć mapowanie starego API do nowego.

cs95
źródło
2
Jak to zrobić WEWNĄTRZ funkcji tf.?
mathtick
@mentalmushroom Nie można znaleźć dokumentacji, ale jest o niej mowa w podręczniku dostosowań . Więcej szczegółów można znaleźć w źródle .
nish-ant
5
W TF 2.0 pojawia się następujący błąd: „Obiekt 'Tensor' nie ma atrybutu 'numpy'”
Will.Evo,
@ Will.Evo, możliwe, że wyłączyłeś przyspieszone wykonywanie przed uruchomieniem tego. Sprawdź drugą połowę mojej odpowiedzi, gdzie możesz użyć eval().
cs95
2
Nie, nie wyłączyłem gorącej egzekucji. Nadal otrzymuję AttributeError: Obiekt „Tensor” nie ma atrybutu „numpy”
Geoffrey Anderson
6

Musisz:

  1. zakoduj tensor obrazu w jakimś formacie (jpeg, png) do tensora binarnego
  2. ocenić (uruchomić) binarny tensor w sesji
  3. zamień plik binarny na strumień
  4. feed do obrazu PIL
  5. (opcjonalnie) wyświetl obraz za pomocą matplotlib

Kod:

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)

To zadziałało dla mnie. Możesz to wypróbować w notatniku ipython. Nie zapomnij tylko dodać następującego wiersza:

%matplotlib inline
Gooshan
źródło
4

Może możesz spróbować , tej metody:

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
źródło
2

Zmierzyłem się i rozwiązałem konwersję tensor-> ndarray w konkretnym przypadku tensorów reprezentujących (kontradyktoryjne) obrazy, uzyskane za pomocą biblioteki / tutoriali cleverhans .

Myślę, że moje pytanie / odpowiedź ( tutaj ) może być pomocnym przykładem także w innych przypadkach.

Jestem nowy w TensorFlow, mój wniosek empiryczny:

Wydaje się, że metoda tensor.eval () może być konieczne, aby odnieść sukces, również wartość wejściowych zastępcze . Tensor może działać jak funkcja, która potrzebuje swoich wartości wejściowych (dostarczonych do feed_dict), aby zwrócić wartość wyjściową, np

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

Zwróć uwagę, że w moim przypadku nazwą symbolu zastępczego jest x , ale przypuszczam, że powinieneś znaleźć właściwą nazwę dla wejściowego symbolu zastępczego . x_inputjest wartością skalarną lub tablicą zawierającą dane wejściowe.

W moim przypadku podanie również sessbyło obowiązkowe.

Mój przykład obejmuje również część dotyczącą wizualizacji obrazu matplotlib , ale to jest OT.

Fabiano Tarlao
źródło
1

Prostym przykładem może być:

    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.

Teraz, jeśli chcemy, aby ten tensor a został przekształcony w tablicę numpy

    a_np=a.eval()
    print(type(a_np))
    #<class 'numpy.ndarray'>

Tak proste jak to!

Saurabh Kumar
źródło
//nie służy do komentowania w Pythonie. Zmień swoją odpowiedź.
Vlad
0

Możesz użyć funkcji zaplecza 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'>

Mam nadzieję, że to pomoże!

Ebin Zacharias
źródło