Odpowiedzi:
Każdy tensor zwrócony przez tablicę NumPy Session.run
lub eval
jest 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.run
lub 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'>
Aby przekonwertować z powrotem z tablicy tensor do numpy, możesz po prostu uruchomić .eval()
przekształcony tensor.
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?
.eval()
wywołanie metody z poziomu sesji: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
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.
eval()
.
Musisz:
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
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_input
jest wartością skalarną lub tablicą zawierającą dane wejściowe.
W moim przypadku podanie również sess
było obowiązkowe.
Mój przykład obejmuje również część dotyczącą wizualizacji obrazu matplotlib , ale to jest OT.
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!
//
nie służy do komentowania w Pythonie. Zmień swoją odpowiedź.
Szukałem dni dla tego polecenia.
To działało dla mnie poza jakąkolwiek sesją lub czymś takim.
# 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
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!