[python] Tensorflow는`dataset.map (mapFn)`의 메소드에서 ‘image.shape’을 가져올 수 없습니다.

가장 작은 이미지 크기를로 조정 하는와 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)



답변

답을 찾았습니다. 내 resize 메소드는 열악한 실행에서 잘 작동했지만 사실 내 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()모든 것이 정상적으로 작동했습니다.


답변