Tensorflow không thể lấy `image.shape` từ phương thức trong` tập dữ liệu.map (mapFn)`


10

Tôi đang cố gắng thực hiện tensorflowtương đương torch.transforms.Resize(TRAIN_IMAGE_SIZE), thay đổi kích thước hình ảnh nhỏ nhấtTRAIN_IMAGE_SIZE . Một cái gì đó như thế này

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)

Câu trả lời đơn giản là ở đây: Tensorflow: Cắt vùng hình vuông trung tâm lớn nhất của hình ảnh

Nhưng khi tôi sử dụng phương pháp với tf.data.Dataset.map(transforms), tôi nhận được shape=(None,None,3)từ bên trong largest_sq_crop(image). Phương pháp hoạt động tốt khi tôi gọi nó bình thường.


1
Tôi tin rằng vấn đề phải làm với thực tế EagerTensorslà không có sẵn bên trong Dataset.map()nên hình dạng không rõ. có một cách giải quyết?
michael

Bạn có thể bao gồm định nghĩa của largest_sq_crop?
jakub

Câu trả lời:


1

Tôi tìm thấy câu trả lời. Nó phải làm với thực tế là phương pháp thay đổi kích thước của tôi hoạt động tốt với thực thi háo hức, ví dụ tf.executing_eagerly()==Truenhưng thất bại khi được sử dụng bên trong dataset.map(). Rõ ràng, trong môi trường thực thi đó , tf.executing_eagerly()==False.

Lỗi của tôi là ở chỗ tôi đã giải nén hình dạng của hình ảnh để lấy kích thước cho tỷ lệ. Thực thi đồ thị hàng chục dường như không hỗ trợ truy cập vào tensor.shapebộ dữ liệu.

  # 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)

Tôi đã sử dụng kích thước hình dạng xuôi dòng trong dataset.map()chức năng của mình và nó đã ném ngoại lệ sau bởi vì nó nhận được Nonethay vì giá trị.

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

Khi tôi chuyển sang giải nén thủ công hình dạng từ đó tf.shape(), mọi thứ đều hoạt động tốt.

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.