টেনসরফ্লো method dataset.map (mapFn) method পদ্ধতি থেকে `চিত্র.শাপ` পেতে পারে না`


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)

সহজ উত্তরটি এখানে: টেনসরফ্লো: চিত্রের বৃহত্তম কেন্দ্রীয় বর্গক্ষেত্রের অঞ্চল ক্রপ করুন

তবে আমি যখন এই পদ্ধতিটি ব্যবহার করি তখন আমি ভিতরে থেকে tf.data.Dataset.map(transforms)আসি । আমি যখন এটিকে সাধারণভাবে কল করি তখন পদ্ধতিটি ঠিকঠাক কাজ করে।shape=(None,None,3)largest_sq_crop(image)


1
আমি বিশ্বাস করি যে সমস্যাটি সেই সত্যের সাথে সম্পর্কিত যা আকারের মধ্যে অজানা হিসাবে EagerTensorsউপলব্ধ নয় are Dataset.map()এখানে কি কাজ আছে?
মাইকেল 25

আপনি সংজ্ঞা অন্তর্ভুক্ত করতে পারেন largest_sq_crop?
জাকব

উত্তর:


1

আমি উত্তর খুঁজে পেয়েছি। এটির সাথে আমার সম্পর্ক পরিবর্তন করার পদ্ধতিটি উদগ্রীব মৃত্যুদন্ডের সাথে সূক্ষ্মভাবে কাজ করেছে এই বিষয়টিটি করতে হবে, উদাহরণস্বরূপ tf.executing_eagerly()==Trueতবে এর মধ্যে ব্যবহারের সময় ব্যর্থ হয়েছে dataset.map()। স্পষ্টতই, মৃত্যুদণ্ড কার্যকর পরিবেশে tf.executing_eagerly()==False,।

স্কেলিংয়ের মাত্রা পেতে আমি যেভাবে চিত্রটির আকারটি প্যাকিং করছি তাতে আমার ত্রুটি ছিল। টেনসরফ্লো গ্রাফ এক্সিকিউশন টিউপলটিতে অ্যাক্সেস সমর্থন করে বলে মনে হচ্ছে না tensor.shape

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