Làm cách nào tôi có thể chuyển đổi một tenxơ thành một mảng gọn gàng trong TensorFlow?


181

Làm thế nào để chuyển đổi một tenxơ thành một mảng numpy khi sử dụng Tensorflow với các ràng buộc Python?

Câu trả lời:


134

Bất kỳ tenor nào được trả về bởi Session.runhoặc evallà một mảng NumPy.

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

Hoặc là:

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

Hoặc, tương đương:

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

EDIT: Không phải bất kỳ tenor nào được trả về bởi Session.runhoặc eval()là một mảng NumPy. Ví dụ, các giá trị thưa thớt được trả về là SpzzyTensorValue:

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

AttributionError: mô-đun 'tenorflow' không có thuộc tính 'Phiên'
Jürgen K.

77

Để chuyển đổi trở lại từ tenor sang mảng numpy, bạn chỉ cần chạy .eval()trên tenxơ đã chuyển đổi.


5
để làm rõ: yourtensor.eval ()
mrk

12
Tôi nhận được 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)'Điều này chỉ có thể sử dụng được trong một phiên kéo dài?
Eduardo Pignatelli

@EduardoPignatelli Nó hoạt động với tôi ở Theano mà không phải làm thêm. Không chắc chắn về tf.
BallpointBen

5
@EduardoPignatelli bạn cần thực hiện .eval()cuộc gọi phương thức từ bên trong một phiên: sess = tf.Session(); with sess.as_default(): print(my_tensor.eval())
duhaime

Bằng cách sử dụng điều này, tôi nhận được lỗi là AttributionError: 'Đối tượng tenor' không có thuộc tính 'eval'
Aakash aggarwal

72

Kéo căng 2.x

Thực thi Eager được bật theo mặc định, vì vậy chỉ cần gọi .numpy()đối tượng 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)

Điều đáng chú ý (từ các tài liệu),

Mảng Numpy có thể chia sẻ bộ nhớ với đối tượng Tensor. Mọi thay đổi đối với cái này có thể được phản ánh trong cái khác.

Nhấn mạnh đậm của tôi. Một bản sao có thể hoặc không thể được trả lại, và đây là một chi tiết thực hiện.


Nếu Thực thi Eager bị vô hiệu hóa, bạn có thể xây dựng một biểu đồ và sau đó chạy nó qua 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)

Xem thêm Bản đồ biểu tượng TF 2.0 để ánh xạ API cũ sang API mới.


2
Làm thế nào để làm điều này bên trong một tf.feft?
mathtick

@mentalmushroom Không thể tìm thấy tài liệu nhưng nó được đề cập trong hướng dẫn tùy chỉnh . Thêm chi tiết có thể được tìm thấy trong nguồn .
nish-ant

5
Tôi nhận được lỗi sau trong TF 2.0: "Đối tượng"
Tenor

@ Will.Evo có thể bạn đã vô hiệu hóa thực thi háo hức trước khi chạy này. Kiểm tra nửa sau của câu trả lời của tôi, nơi bạn có thể sử dụng eval().
cs95

2
Không, tôi đã không vô hiệu hóa thực thi háo hức. Vẫn nhận được AttributionError: đối tượng 'Tenor' không có thuộc tính 'numpy'
Geoffrey Anderson

6

Bạn cần phải:

  1. mã hóa tenxơ hình ảnh ở một số định dạng (jpeg, png) thành tenxơ nhị phân
  2. đánh giá (chạy) tenxơ nhị phân trong một phiên
  3. biến nhị phân thành luồng
  4. đưa vào hình ảnh PIL
  5. (tùy chọn) hiển thị hình ảnh với matplotlib

Mã số:

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)

Điều này làm việc cho tôi. Bạn có thể thử nó trong một máy tính xách tay ipython. Chỉ cần đừng quên thêm dòng sau:

%matplotlib inline

4

Có lẽ bạn có thể thử phương pháp này:

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

Tôi đã phải đối mặt và giải quyết chuyển đổi tenor-> ndarray trong trường hợp cụ thể của các tenx đại diện cho các hình ảnh (nghịch cảnh), thu được bằng các thông minh thư viện / hướng dẫn.

Tôi nghĩ rằng câu hỏi / câu trả lời của tôi ( ở đây ) có thể là một ví dụ hữu ích cho các trường hợp khác.

Tôi mới sử dụng TensorFlow, của tôi là một kết luận theo kinh nghiệm:

Có vẻ như phương thức tenor.eval () có thể cần, để thành công, cũng là giá trị cho các trình giữ chỗ đầu vào . Tenor có thể hoạt động giống như một hàm cần các giá trị đầu vào của nó (được cung cấp vào feed_dict) để trả về giá trị đầu ra, ví dụ

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

Xin lưu ý rằng tên giữ chỗ là x trong trường hợp của tôi, nhưng tôi cho rằng bạn nên tìm ra tên đúng cho trình giữ chỗ đầu vào . x_inputlà một giá trị vô hướng hoặc mảng chứa dữ liệu đầu vào.

Trong trường hợp của tôi cũng cung cấp sesslà bắt buộc.

Ví dụ của tôi cũng bao gồm phần trực quan hóa hình ảnh matplotlib , nhưng đây là OT.


1

Một ví dụ đơn giản có thể là,

    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 bây giờ nếu chúng ta muốn tenor này được chuyển đổi thành một mảng numpy

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

Đơn giản vậy thôi!


//không phải để bình luận trong python. Vui lòng chỉnh sửa câu trả lời của bạn.
Vlad


0

Bạn có thể sử dụng chức năng phụ trợ máy ảnh.

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

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

print(type(array))

<class 'numpy.ndarray'>

Tôi hy vọng nó sẽ giúp!

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.