Як я можу перетворити тензор у масив нумерації в TensorFlow?


Відповіді:


134

Будь-який тензор, що повертається Session.runабо evalє масивом NumPy.

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

Або:

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

Або, рівнозначно:

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

EDIT: Чи не будь- тензор повертається Session.runабо eval()є масивом NumPy. Скажені тензори, наприклад, повертаються як SparseTensorValue:

>>> print(type(tf.Session().run(tf.SparseTensor([[0, 0]],[1],[1,2]))))
<class 'tensorflow.python.framework.sparse_tensor.SparseTensorValue'>

AttributeError: модуль 'tensorflow' не має атрибута 'Session'
Юрген К.

77

Для перетворення назад з тензора в numpy масив ви можете просто запустити .eval()перетворений тензор.


5
уточнити: yourtensor.eval ()
mrk

12
Я розумію, 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)'чи це корисно лише під час сеансу tensoflow?
Едуардо Піньятеллі

@EduardoPignatelli Це працює для мене в Теано без зайвої роботи. Не впевнений про тф.
BallpointBen

5
@EduardoPignatelli вам потрібно запустити .eval()виклик методу з сеансу: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime

Використовуючи це, я отримую помилку як AttributeError: об’єкт 'Tensor' не має атрибута 'eval'
Aakash aggarwal

73

TensorFlow 2.x

Швидке виконання увімкнено за замовчуванням, тому просто зателефонуйте .numpy()на об'єкт 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)

Варто зазначити (з док.),

Numpy масив може обмінюватися пам'яттю з об'єктом Tensor. Будь-які зміни в одній можуть бути відображені в іншій.

Сміливий акцент мій. Копія може бути повернута або не може бути, і це детальна інформація про реалізацію.


Якщо Eager Execution вимкнено, ви можете скласти графік, а потім запустити його 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)

Див. Також Карта символів TF 2.0 для відображення старого API на новий.


2
Як це зробити ВНУТРИ tf.function?
mathtick

@mentalmushroom Не вдалося знайти документацію, але вона згадується в посібнику з налаштування . Більш детально можна ознайомитись у джерелі .
ніш-мураха

5
Я отримую таку помилку в TF 2.0: "Об'єкт" Tensor "не має атрибута" numpy ""
Will.Evo

@ Will.Evo, можливо, ви відключили нетерпляче виконання перед запуском цього. Перевірте другу половину моєї відповіді, де ви можете використовувати eval().
cs95

2
Ні, я не відключив нетерпляче виконання. Все-таки отримайте AttributeError: Об'єкт 'Tensor' не має атрибута 'numpy'
Джеффрі Андерсон

6

Тобі потрібно:

  1. кодуйте тензор зображення в якомусь форматі (jpeg, png) до двійкового тензора
  2. оцінити (запустити) двійковий тензор у сеансі
  3. перетворити двійковий на потоковий
  4. подати на зображення PIL
  5. (необов'язково) відображення зображення за допомогою matplotlib

Код:

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)

Це працювало для мене. Ви можете спробувати його в зошиті ipython. Просто не забудьте додати наступний рядок:

%matplotlib inline

4

Можливо, ви можете спробувати цей метод:

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)

2

Я зіткнувся і вирішив перетворення тензора-> ndarray у конкретному випадку тензорів, що представляють (змагальні) зображення, отримані за допомогою бібліотеки / навчальних посібників розумних людей .

Я думаю, що моє запитання / відповідь ( тут ) може бути корисним прикладом і для інших випадків.

Я новачок у TensorFlow, мій емпіричний висновок:

Здається, що для досягнення успіху методу tensor.eval () може знадобитися також значення для заповнювачів . Тензор може працювати як функція, яка потребує вхідних значень (надається в feed_dict), щоб повернути вихідне значення, наприклад

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

Зверніть увагу, що в моєму випадку ім'я заповнення місця є x , але я вважаю, що ви повинні знайти правильне ім'я для заповнення вводу . x_input- скалярне значення або масив, що містить вхідні дані.

У моєму випадку надання sessбуло обов'язковим.

Мій приклад також охоплює частину візуалізації зображення matplotlib , але це ОТ.


1

Простим прикладом може бути,

    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 тепер, якщо ми хочемо, щоб цей тензор a був перетворений в масивний масив

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

Так просто!


//не для коментарів у python. Відредагуйте свою відповідь.
Влад


0

Ви можете скористатися функцією резервного керасу.

import tensorflow as tf
from tensorflow.python.keras import backend 

sess = backend.get_session()
array = sess.run(< Tensor >)

print(type(array))

<class 'numpy.ndarray'>

Я сподіваюся, що це допомагає!

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.