Вопрос:

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

python numpy tensorflow

200330 просмотра

7 ответа

3824 Репутация автора

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

Автор: mathetes Источник Размещён: 04.12.2015 08:55

Ответы (7)


70 плюса

5383 Репутация автора

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

Автор: Rafał Józefowicz Размещён: 04.12.2015 08:59

5 плюса

1143 Репутация автора

Вам нужно:

  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
Автор: Gooshan Размещён: 17.04.2016 02:59

103 плюса

3353 Репутация автора

Решение

Любой тензор, возвращенный 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'>
Автор: Lenar Hoyt Размещён: 19.06.2016 11:37

3 плюса

49 Репутация автора

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

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 Размещён: 21.03.2017 11:32

2 плюса

1501 Репутация автора

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

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

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

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

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

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

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

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

Автор: Fabiano Tarlao Размещён: 22.09.2018 07:41

2 плюса

51 Репутация автора

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

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

Так просто!

Автор: Saurabh Kumar Размещён: 17.03.2019 10:07

1 плюс

151720 Репутация автора

TensorFlow 2.0

Eager Execution включено по умолчанию, поэтому просто вызовите .numpy()объект Tensor.

import tensorflow as tf

a = tf.constant([[1, 2], [3, 4]])                 
b = tf.add(a, 1)

tf.multiply(a, b).<b>numpy()</b>
# array([[ 2,  6],
#        [12, 20]], dtype=int32)

Стоит отметить, что .numpy()МОЖЕТ ИЛИ НЕ МОЖЕТ возвращать копию базовых данных (это детали реализации).


С отключенным 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 с новым.

Автор: cs95 Размещён: 12.06.2019 04:50
Вопросы из категории :
32x32