Tensorflow `डेटा.शैप` को` डेटासेट / मैप (मैपफ़न) `में विधि से प्राप्त नहीं कर सकता है


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के भीतर उपलब्ध नहीं हैं Dataset.map()तो आकार अज्ञात है। क्या आसपास कोई काम है?
माइकल

क्या आप की परिभाषा को शामिल कर सकते हैं largest_sq_crop?
जकूब

जवाबों:


1

मुझे जवाब मिल गया। यह इस तथ्य के साथ करना था कि मेरी आकार बदलने की विधि ने उत्सुकतापूर्वक निष्पादन के साथ ठीक काम किया, उदाहरण के लिए, tf.executing_eagerly()==Trueलेकिन जब इसका उपयोग किया गया तो असफल रहा dataset.map()। जाहिर है, कि निष्पादन वातावरण में, tf.executing_eagerly()==False

मेरी त्रुटि उस तरह से थी जब मैं स्केलिंग के लिए आयाम प्राप्त करने के लिए छवि के आकार को अनपैक कर रहा था। Tensorflow ग्राफ निष्पादन 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()किया, तो सब कुछ ठीक काम किया।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.