Tensorflow ไม่สามารถรับ "image.shape" จากวิธีการใน `dataset.map (mapFn) '


10

ฉันพยายามที่จะทำtensorflowเทียบเท่าtorch.transforms.Resize(TRAIN_IMAGE_SIZE)ซึ่งปรับขนาดที่เล็กที่สุดTRAIN_IMAGE_SIZEมิติภาพเพื่อ บางสิ่งเช่นนี้

def transforms(filename):
  parts = tf.strings.split(filename, '/')
  label = parts[-2]

  image = tf.io.read_file(filename)
  image = tf.image.decode_jpeg(image)
  image = tf.image.convert_image_dtype(image, tf.float32)

  # this doesn't work with Dataset.map() because image.shape=(None,None,3) from Dataset.map()
  image = largest_sq_crop(image) 

  image = tf.image.resize(image, (256,256))
  return image, label

list_ds = tf.data.Dataset.list_files('{}/*/*'.format(DATASET_PATH))
images_ds = list_ds.map(transforms).batch(4)

คำตอบง่ายๆอยู่ที่นี่: Tensorflow: ครอบตัดพื้นที่จัตุรัสกลางที่ใหญ่ที่สุดของภาพ

แต่เมื่อผมใช้วิธีการที่มีtf.data.Dataset.map(transforms)ที่ฉันได้รับจากภายในshape=(None,None,3) largest_sq_crop(image)วิธีการทำงานได้ดีเมื่อฉันเรียกว่าปกติ


1
ฉันเชื่อว่าปัญหาเกี่ยวข้องกับความจริงที่EagerTensorsไม่มีอยู่ภายในDataset.map()ดังนั้นรูปร่างจึงไม่เป็นที่รู้จัก มีวิธีแก้ปัญหาหรือไม่?
ไมเคิล

คุณสามารถรวมคำจำกัดความของlargest_sq_crop?
jakub

คำตอบ:


1

ฉันพบคำตอบ มันมีจะทำอย่างไรกับความจริงที่ว่าวิธีการปรับขนาดของฉันทำงานได้ดีกับการดำเนินความกระตือรือร้นเช่นแต่ล้มเหลวเมื่อใช้ภายในtf.executing_eagerly()==True dataset.map()เห็นได้ชัดว่าในสภาพแวดล้อมการปฏิบัติtf.executing_eagerly()==Falseนั้น

ข้อผิดพลาดของฉันคือในขณะที่ฉันกำลังแกะรูปร่างของรูปภาพเพื่อให้ได้มิติสำหรับการปรับขนาด การประมวลผลกราฟ Tensorflow ดูเหมือนจะไม่สนับสนุนการเข้าถึงtensor.shapetuple

  # wrong
  b,h,w,c = img.shape
  print("ERR> ", h,w,c)
  # ERR>  None None 3

  # also wrong
  b = img.shape[0]
  h = img.shape[1]
  w = img.shape[2]
  c = img.shape[3]
  print("ERR> ", h,w,c)
  # ERR>  None None 3

  # but this works!!!
  shape = tf.shape(img)
  b = shape[0]
  h = shape[1]
  w = shape[2]
  c = shape[3]
  img = tf.reshape( img, (-1,h,w,c))
  print("OK> ", h,w,c)
  # OK>  Tensor("strided_slice_2:0", shape=(), dtype=int32) Tensor("strided_slice_3:0", shape=(), dtype=int32) Tensor("strided_slice_4:0", shape=(), dtype=int32)

ฉันใช้ขนาดรูปร่างต่อเนื่องในdataset.map()ฟังก์ชั่นของฉันและมันโยนข้อยกเว้นต่อไปนี้เพราะมันได้รับNoneแทนที่จะเป็นค่า

TypeError: Failed to convert object of type <class 'tuple'> to Tensor. Contents: (-1, None, None, 3). Consider casting elements to a supported type.

เมื่อฉันเปลี่ยนเป็นการแกะรูปร่างออกด้วยตนเองtf.shape()ทุกอย่างก็ใช้ได้ดี

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