Подтвердить что ты не робот

Как преобразовать тензор в массив numpy в TensorFlow?

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

4b9b3361

Ответ 1

Любой тензор, возвращаемый 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'>

Ответ 2

Чтобы преобразовать обратно из тензора в массив numpy, вы можете просто запустить .eval() на преобразованный тензор.

Ответ 3

TensorFlow 2.0

Стремительное выполнение включено по умолчанию, поэтому просто вызовите .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 с новым.

Ответ 4

Вам необходимо:

  • закодировать тензор изображения в некотором формате (jpeg, png) до двоичного тензора
  • оценить (запустить) бинарный тензор в сеансе
  • превратить двоичный файл в поток
  • подать на изображение PIL
  • (необязательно) отображает изображение с помощью 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

Ответ 5

Возможно, вы можете попробовать, этот метод:

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)

Ответ 6

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

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

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

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

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

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

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

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

Ответ 7

Простой пример может быть,

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

Так просто!