Tensorflow tidak bisa mendapatkan `image.shape` dari metode di` dataset.map (mapFn) `


10

Saya mencoba melakukan yang tensorflowsetara torch.transforms.Resize(TRAIN_IMAGE_SIZE), yang mengubah ukuran dimensi gambar terkecil menjadi TRAIN_IMAGE_SIZE. Sesuatu seperti ini

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)

Jawaban sederhananya ada di sini: Tensorflow: Memotong wilayah kuadrat pusat gambar terbesar

Tetapi ketika saya menggunakan metode dengan tf.data.Dataset.map(transforms), saya dapatkan shape=(None,None,3)dari dalam largest_sq_crop(image). Metode ini berfungsi dengan baik ketika saya menyebutnya dengan normal.


1
Saya percaya masalahnya ada pada fakta bahwa EagerTensorstidak tersedia di dalam Dataset.map()sehingga bentuknya tidak diketahui. apakah ada solusinya?
michael

Bisakah Anda memasukkan definisi largest_sq_crop?
jakub

Jawaban:


1

Saya menemukan jawabannya. Itu ada hubungannya dengan fakta bahwa metode ukuran saya bekerja dengan baik dengan eksekusi bersemangat, misalnya tf.executing_eagerly()==Truetetapi gagal ketika digunakan di dalam dataset.map(). Rupanya, di lingkungan eksekusi itu tf.executing_eagerly()==False,.

Kesalahan saya adalah cara saya membongkar bentuk gambar untuk mendapatkan dimensi untuk penskalaan. Eksekusi grafik Tensorflow tampaknya tidak mendukung akses ke 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)

Saya menggunakan dimensi bentuk hilir dalam dataset.map()fungsi saya dan melemparkan pengecualian berikut karena itu mendapatkan Nonebukan nilai.

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

Ketika saya beralih ke membongkar bentuk secara manual tf.shape(), semuanya bekerja dengan baik.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.