วิธีการแปลง Tensor เป็น Eager tensor ใน Tensorflow 2.1.0?

Oct 17 2020

ฉันพยายามแปลงประเภทเทนเซอร์:

tensorflow.python.framework.ops.Tensor

ไปยัง eagertensor:

<class 'tensorflow.python.framework.ops.EagerTensor'>

ฉันกำลังค้นหาวิธีแก้ปัญหา แต่ไม่พบ ความช่วยเหลือใด ๆ จะได้รับการชื่นชม

บริบท:

ฉันได้รับเทนเซอร์โดยใช้วิธีการแยกคุณลักษณะจากโมเดล Keras Sequential เอาต์พุตเป็นเทนเซอร์ของประเภทที่กล่าวถึงครั้งแรก อย่างไรก็ตามเมื่อฉันพยายามแปลงเป็น numpy โดยใช้. numpy () มันไม่ทำงานกับข้อผิดพลาดต่อไปนี้:

'Tensor' object has no attribute 'numpy'

แต่เมื่อฉันลองสร้างเทนเซอร์โดยใช้ tf.constant แล้วใช้. numpy () เพื่อแปลงมันก็ใช้ได้ดี!

ความแตกต่างเพียงอย่างเดียวที่ฉันพบคือประเภทของเทนเซอร์แตกต่างกัน: เทนเซอร์ที่สร้างโดยลำดับ Keras เป็นประเภทแรกที่กล่าวถึงข้างต้นในขณะที่เทนเซอร์ที่ฉันสร้างขึ้นด้วยตนเองเป็นประเภทที่สอง (Eager tensor)

คำตอบ

1 TFer Oct 22 2020 at 01:01

การเขียนคำตอบอีกหนึ่งคำตอบเนื่องจากข้อผิดพลาดเดียวกันปรากฏขึ้นในสถานการณ์ที่ต่างกัน

ข้อผิดพลาดที่คุณได้รับเป็นเพราะปัญหารุ่น tensorflow version 2.1.0.ie ฉันรันโค้ดโดยข้าม 2 ย่อหน้าแรกที่จะติดตั้งtensorflow==2.1.0และkeras==2.3.1ข้อผิดพลาดไม่ปรากฏขึ้นอีก

ปัญหาของคุณหายไปในเวอร์ชันล่าสุดของtensorflow version 2.3.0. เรียกใช้โปรแกรมในเวอร์ชันล่าสุดนั่นหมายความว่าอย่าติดตั้ง tensorflow และ keras อีกเนื่องจาก Google Colab ได้ติดตั้งเวอร์ชันล่าสุดและเสถียรไว้แล้ว

features.numpy()

เอาต์พุต -

array([[0.       , 0.3728346, 0.       , ..., 1.0103987, 0.       ,
        0.4194043]], dtype=float32)
1 TFer Oct 20 2020 at 16:32

อาจตอบได้ดีกว่าหากคุณจะแชร์รหัสที่ทำซ้ำได้

ด้านล่างนี้เป็นสถานการณ์ง่ายๆที่ฉันได้สร้างข้อผิดพลาดของคุณขึ้นใหม่ ที่นี่ฉันกำลังอ่านเส้นทางของไฟล์รูปภาพ

รหัสเพื่อสร้างข้อผิดพลาดใหม่:

%tensorflow_version 2.x
import tensorflow as tf
import numpy as np

def get_path(file_path):
    print("file_path: ", bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))
    return file_path

train_dataset = tf.data.Dataset.list_files('/content/bird.png')
train_dataset = train_dataset.map(lambda x: (get_path(x)))

for one_element in train_dataset:
    print(one_element)

เอาท์พุต:

---------------------------------------------------------------------------
AttributeError                            Traceback (most recent call last)
<ipython-input-8-2d5db8425f67> in <module>()
      8 
      9 train_dataset = tf.data.Dataset.list_files('/content/bird.png')
---> 10 train_dataset = train_dataset.map(lambda x: (get_path(x)))
     11 
     12 for one_element in train_dataset:

10 frames
/usr/local/lib/python3.6/dist-packages/tensorflow/python/autograph/impl/api.py in wrapper(*args, **kwargs)
    256       except Exception as e:  # pylint:disable=broad-except
    257         if hasattr(e, 'ag_error_metadata'):
--> 258           raise e.ag_error_metadata.to_exception(e)
    259         else:
    260           raise

AttributeError: in user code:

    <ipython-input-8-2d5db8425f67>:10 None  *
        train_dataset = train_dataset.map(lambda x: (get_path(x)))
    <ipython-input-8-2d5db8425f67>:6 get_path  *
        print("file_path: ", bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))

    AttributeError: 'Tensor' object has no attribute 'numpy'

ด้านล่างนี้เป็นขั้นตอนที่ฉันได้ใช้ในโค้ดเพื่อแก้ไขข้อผิดพลาดนี้

  1. ได้ตกแต่งฟังก์ชั่นแผนที่ด้วยtf.py_function(get_path, [x], [tf.string]). คุณสามารถค้นหาข้อมูลเพิ่มเติมเกี่ยวกับ tf.py_function ที่นี่
  2. ตอนนี้ฉันสามารถรับส่วนสตริงได้โดยใช้bytes.decode(file_path.numpy())ในฟังก์ชันแผนที่

รหัสคงที่:

%tensorflow_version 2.x
import tensorflow as tf
import numpy as np

def get_path(file_path):
    print("file_path: ",bytes.decode(file_path.numpy()),type(bytes.decode(file_path.numpy())))
    return file_path

train_dataset = tf.data.Dataset.list_files('/content/bird.jpg')
train_dataset = train_dataset.map(lambda x: tf.py_function(get_path, [x], [tf.string]))

for one_element in train_dataset:
    print(one_element)

เอาท์พุต:

file_path:  /content/bird.jpg <class 'str'>
(<tf.Tensor: shape=(), dtype=string, numpy=b'/content/bird.jpg'>,)

หวังว่านี่จะตอบคำถามของคุณ