ฉันจะแปลงเมตริกซ์เป็นอาร์เรย์ numpy ใน 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'>

แก้ไข:ไม่มีเมตริกซ์ใด ๆ ที่ส่งคืนโดย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: โมดูล 'tensorflow' ไม่มีแอตทริบิวต์ 'Session'
Jürgen K.

77

ในการแปลงกลับจากเทนเซอร์เป็นจำนวนมากคุณสามารถเรียกใช้.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)'มันใช้งานได้เฉพาะในช่วงเซสชั่น 10 เท่าหรือไม่
Eduardo Pignatelli

@EdardoPignatelli มันเหมาะกับฉันใน Theano ที่ไม่มีงานพิเศษ ไม่แน่ใจเกี่ยวกับ TF
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
วิธีการทำสิ่งนี้ภายใน tf.function
mathtick

@mentalmushroom ไม่พบเอกสาร แต่ก็เป็นที่กล่าวถึงใน การปรับแต่งคู่มือ รายละเอียดเพิ่มเติมสามารถพบได้ในแหล่งที่มา
nish-ant

5
ฉันได้รับข้อผิดพลาดต่อไปนี้ใน TF 2.0: "วัตถุ Tensor 'ไม่มีแอตทริบิวต์' numpy '"
Will.Evo

@ Will.Evo เป็นไปได้ว่าคุณปิดการใช้งานการดำเนินการกระตือรือร้นก่อนที่จะเรียกใช้นี้ eval()ตรวจสอบช่วงครึ่งหลังของคำตอบของฉันที่คุณสามารถใช้
cs95

2
ไม่ฉันไม่ได้ปิดใช้งานการดำเนินการกระตือรือร้น ยังคงได้รับ AttributeError: วัตถุ 'Tensor' ไม่มีแอตทริบิวต์ 'numpy'
Geoffrey Anderson

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แต่นี่คือ 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.

ตอนนี้ถ้าเราต้องการให้เมตริกซ์ a นี้ถูกแปลงเป็นอาร์เรย์ที่มีค่า

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

ง่ายเหมือนที่!


//ไม่ได้มีไว้สำหรับแสดงความคิดเห็นในหลาม โปรดแก้ไขคำตอบของคุณ
Vlad


0

คุณสามารถใช้ฟังก์ชันแบ็กเอนด์ keras

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

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

print(type(array))

<class 'numpy.ndarray'>

ฉันหวังว่ามันจะช่วย!

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.