Как я могу преобразовать тензор в массив Numpy в TensorFlow?


181

Как преобразовать тензор в массив Numpy при использовании Tensorflow с привязками Python?

Ответы:


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'>

РЕДАКТИРОВАТЬ: не любой тензор, возвращенный Session.runили eval()является массивом NumPy. Например, Sparse Tensors возвращаются как SparseTensorValue:

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

AttributeError: у модуля tenensflow нет атрибута 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)'Это можно использовать только во время сеанса с десятками потоков?
Эдуардо Пигнателли

@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

Eager Execution включено по умолчанию, поэтому просто вызовите .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
Как это сделать ВНУТРИ функции?
математика

@mentalmushroom Не удалось найти документацию, но она упоминается в руководстве по настройке . Более подробную информацию можно найти в источнике .
nish-ant

5
Я получаю следующую ошибку в TF 2.0: «Объект« Тензор »не имеет атрибута« 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 в конкретном случае тензоров, представляющих (состязательные) изображения, полученные с помощью библиотеки / учебных пособий Cleverhans .

Я думаю, что мой вопрос / ответ ( здесь ) может быть полезным примером и для других случаев.

Я новичок в TensorFlow, мой эмпирический вывод:

Похоже, что для метода tenor.eval () может потребоваться также значение для входных заполнителей . Тензор может работать как функция, которая нуждается во входных значениях (предоставленных в feed_dict) для возврата выходного значения, например

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

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

В моем случае предоставление также sessбыло обязательным.

Мой пример также охватывает часть визуализации изображений matplotlib , но это OT.


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.

п теперь, если мы хотим, чтобы этот тензор был преобразован в массив NumPy

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

Так просто, как, что!


//не для комментирования в Python. Пожалуйста, отредактируйте свой ответ.
Влад


0

Вы можете использовать функцию keras backend.

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.