Tensorflowは `dataset.map(mapFn)`のメソッドから `image.shape`を取得できません


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)

簡単な答えは次のとおりです。Tensorflow:画像の中央の正方形の最大領域を切り抜きます

しかし、メソッドをtf.data.Dataset.map(transforms)で使用すると、shape=(None,None,3)内部から取得されlargest_sq_crop(image)ます。メソッドを正常に呼び出すと、メソッドは正常に動作します。


1
問題はEagerTensors内部で利用できないDataset.map()ために形状が不明であるという事実に関係していると思います。回避策はありますか?
マイケル

の定義を含めることができますlargest_sq_cropか?
ジャクブ

回答:


1

答えを見つけました。それは、私の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()、すべてが正常に機能しました。

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.