Tensorflow Datasets:ข้าวโพดไปส่วนหนึ่/ปรับขนาดภาพต่างๆต่อการประมวลผลกลุ่มภาพหลังจากวันที่.การประมวลผลกลุ่มภาพ()

0

คำถาม

มันจะเป็นไปได้ข้าวโพดไปส่วนหนึ่/ปรับขนาดภาพต่างๆต่อการประมวลผลกลุ่มภาพ?

ฉันกำลังใช้ Tensorflow วันที่รูปแบบ api ที่ด้านล่างนี้:

dataset = dataset.shuffle().repeat().batch(batch_size, drop_remainder=True)

ฉันต้องการในการประมวลผลกลุ่มภาพทั้งหมดภาพควรจะต้องไปในรูขนาดเดียวกัน. อย่างไรก็ข้าม batches มันจะต้องแตกต่างขนาด

สำหรับตัวอย่างให้หน่วยที่ 1 ระงับการประมวลผลกลุ่มภาพได้ทั้งหมดภาพต่างๆของรูปร่าง(batch_size,300,300,3). ต่อการประมวลผลกลุ่มภาพได้ภาพของรูปร่าง(batch_size,224,224,3). อีกการประมวลผลกลุ่มภาพได้ภาพของรูปร่าง(batch_size,400,400,3).

ง่ายๆเลยคือฉันต้องการที่จะมี dymanically รูปร่าง batches อย่างไรก็ตามทั้งหมดภาพต่างๆในการประมวลผลกลุ่มภาพมีคลื่นเสียงบอกความของรูปร่าง

ถ้าเราทำตามที่ติดตาม:

dataset = dataset.shuffle().repeat().batch(batch_size, drop_remainder=True).map(lambda x, y: map_fn(x, y))

ที่ด้านบนแผนที่()ใช้กับแต่ละการประมวลผลกลุ่มภาพต่างกันหรือทั้งหมดวันที่?

ถ้าทางด้านบนแผนที่()ไม่ต้องกันการประมวลผลกลุ่มภาพต่างกัน,แล้วพวกเราจะเป็นยังไงทำแบบนี้? เราสามารถกำหนดอะไร iterator หลังจากวันที่.การประมวลผลกลุ่มภาพ(),ปรับใช้ tf.ภาพได้ที่นี่crop_and_resize()กับภาพต่อการประมวลผลกลุ่มภาพแล้วหลังจากนั้นใช้วันที่.concatenate()จะรวมทุกเปลี่ยน batches?

ฉันกำลังสร้างควันที่เป็นด้านล่างนี้:

# Dataset creation (read image data from files of COCO dataset)
dataset = tf.data.Dataset.list_files(self._file_pattern, shuffle=False)
dataset = dataset.shard(dataset_num_shards, dataset_shard_index)
dataset = dataset.shuffle(tf.cast(256 / dataset_num_shards, tf.int64))
dataset = dataset.interleave(map_func=tf.data.TFRecordDataset(filename).prefetch(1), cycle_length=32, block_length=1, num_parallel_calls=tf.data.experimental.AUTOTUNE)
dataset = dataset.map(tf_example_decoder.TfExampleDecoder().decode, num_parallel_calls=64)
dataset = dataset.shuffle(64).repeat()
# Parse each image for preprocessing
dataset = dataset.map(lambda data, _: _parse_example(data), num_parallel_calls=64)
dataset = dataset.batch(batch_size=batch_size, drop_remainder=True)

# Below code suggested by you to resize images to fixed shape in each batch
def resize_data(images, labels):
    tf.print('Original shape -->', tf.shape(images))
    SIZE = (300, 300)
    return tf.image.resize(images, SIZE), labels
dataset = dataset.map(resize_data)
dataset = dataset.prefetch(tf.data.experimental.AUTOTUNE)

tf.estimator.Estimator(...).train(
        input_fn=dataset,
        steps=steps,
        hooks=train_hooks)
python tensorflow tensorflow-datasets
2021-11-24 05:50:45
1

คำตอบที่ดีที่สุด

1

โดยปกติแล้วคุณสามารถลองบางอย่างเหมือนนี้:

import tensorflow as tf
import numpy as np

dataset1 = tf.data.Dataset.from_tensor_slices(np.random.random((32, 300, 300, 3)))
dataset2 = tf.data.Dataset.from_tensor_slices(np.random.random((32, 224, 224, 3)))
dataset3 = tf.data.Dataset.from_tensor_slices(np.random.random((32, 400, 400, 3)))
dataset = dataset1.concatenate(dataset2.concatenate(dataset3))
dataset = dataset.shuffle(1).repeat().batch(32, drop_remainder=True)

def resize_data(images):
  tf.print('Original shape -->', tf.shape(images))
  SIZE = (180, 180)

  return tf.image.resize(images, SIZE)

dataset = dataset.map(resize_data)

for images in dataset.take(3):
  tf.print('New shape -->', tf.shape(images))
Original shape --> [32 300 300 3]
New shape --> [32 180 180 3]
Original shape --> [32 224 224 3]
New shape --> [32 180 180 3]
Original shape --> [32 400 400 3]
New shape --> [32 180 180 3]

คุณอาจจะยังใช้ tf.image.resize_with_crop_or_pad ถ้าคุณต้องการ:

def resize_data(images):
  tf.print('Original shape -->', tf.shape(images))
  SIZE = (180, 180)
  return tf.image.resize_with_crop_or_pad(images, SIZE[0], SIZE[1])

dataset = dataset.map(resize_data)

for images in dataset.take(3):
  tf.print('New shape -->', tf.shape(images))

ควรจำไว้ว่าการใช้ repeat() จะต้องสร้างไม่มีที่สิ้นสุดคือ...วันที่.

ปรับปรุ 1

ถ้าคุณต้องการให้เป็นแบบสุ่มขนาดสำหรับแต่ละการประมวลผลกลุ่มภาพลบางอย่างเหมือนนี้:

import tensorflow as tf
import numpy as np

dataset1 = tf.data.Dataset.from_tensor_slices(np.random.random((32, 300, 300, 3)))
dataset2 = tf.data.Dataset.from_tensor_slices(np.random.random((32, 224, 224, 3)))
dataset3 = tf.data.Dataset.from_tensor_slices(np.random.random((32, 400, 400, 3)))
dataset = dataset1.concatenate(dataset2.concatenate(dataset3))
dataset = dataset.batch(32, drop_remainder=True).shuffle(96)


def resize_data(images):
  batch_size = tf.shape(images)[0]
  images_resized = tf.TensorArray(dtype=tf.float32, size = 0, dynamic_size=True)
  SIZE = tf.random.uniform((2,), minval=300, maxval=500, dtype=tf.int32)
  for i in range(batch_size):
    images_resized = images_resized.write(images_resized.size(), tf.image.resize(images[i], SIZE))
  return images_resized.stack()

dataset = dataset.map(resize_data)

for images in dataset:
  tf.print('New shape -->', tf.shape(images))
New shape --> [32 392 385 3]
New shape --> [32 468 459 3]
New shape --> [32 466 461 3]

ปรับปรุง 2

มายืดหยุ่นตัวเลือกที่ทำงานให้มีการประมวลผลกลุ่มภาพขนาดของคนดูเหมือนนี้:

import tensorflow as tf
import numpy as np

dataset1 = tf.data.Dataset.from_tensor_slices(np.random.random((32, 300, 300, 3)))
dataset2 = tf.data.Dataset.from_tensor_slices(np.random.random((32, 224, 224, 3)))
dataset3 = tf.data.Dataset.from_tensor_slices(np.random.random((32, 400, 400, 3)))
dataset = dataset1.concatenate(dataset2.concatenate(dataset3))

def resize_and_batch(dataset, batch_size):
  final_dataset = None
  duration = len(dataset)//batch_size
  random_sizes = [tf.random.uniform((2,), minval=300, maxval=500, dtype=tf.int32) for _ in range(duration)]

  for i, size in zip(range(duration), random_sizes):
    idx = i * batch_size
    if i == 0:
      final_dataset = tf.data.Dataset.from_tensor_slices([tf.image.resize(x, size) for x in dataset.take(batch_size)])
    else:
      final_dataset = final_dataset.concatenate(tf.data.Dataset.from_tensor_slices([tf.image.resize(x, size) for x in dataset.skip(idx).take(batch_size)]))
  return final_dataset

batch_size = 10
ds = resize_and_batch(dataset, batch_size)
ds = ds.batch(batch_size).shuffle(len(ds))
for images in ds:
 tf.print('New shape -->', images.shape)
New shape --> TensorShape([10, 399, 348, 3])
New shape --> TensorShape([10, 356, 329, 3])
New shape --> TensorShape([10, 473, 373, 3])
New shape --> TensorShape([10, 489, 489, 3])
New shape --> TensorShape([10, 421, 335, 3])
New shape --> TensorShape([10, 447, 455, 3])
New shape --> TensorShape([10, 355, 382, 3])
New shape --> TensorShape([10, 310, 396, 3])
New shape --> TensorShape([10, 345, 356, 3])
2021-12-01 14:51:04

มันดูดี แต่มันยังไม่ได้ทำงานออกไปสำหรับฉัน ตอนที่ฉันพยายามให้รถไฟขบวนรุ่นมันทำให้เกิดข้อผิดพลาดเหมือนด้านล่างนี้: INVALID_ARGUMENT: Cannot add tensor to the batch: number of elements does not match. Shapes are: [tensor]: [640,426,3], [batch]: [480,640,3] ถึงแม้ว่าฉันให้ของขนาด=(300,300)ใน tf.ภาพได้ที่นี่ปรับขนาด(ภาพ,ขนาด,การประมวลผลกลุ่มภาพมีขนาด=(480,640). และอย่างที่หน้าของภาพมีขนาดที่แตกต่างกัน=(640,426)มันล้มเหลวในการเพิ่มมันต้องการประมวลผลกลุ่มภาพ. นั่นหมายความว่ายังไงมันก็ไม่สามารถใช้ได้แผนที่ฟังก์ชัน()จะอยู่แต่ละบุคคลหนึ่งการประมวลผลกลุ่มภาพ. ช่วย/ความคิด?
Avid Learner

คุณช่วยเพิ่มรหัสไปหรอกว่าคุณกำลังสร้างของคุณ datasets ต้องของคุณคำถามเหรอ? ฉันคิดว่าฉันต้องทำมามีเงื่อนงำอะไรในปัญหาอาจจะเป็น
AloneTogether

ฉันปรับปรุงคำถามกับวิธีที่ฉันกำลังสร้างในวันที่. รอสำหรับของคุณตอบกลับ.
Avid Learner

ปรับปรุงตอบคำ-
AloneTogether

batch_size=ยุ 16 มันเป็นการโยนเดียวกันเกิดข้อผิดพลาดกับ batch_size>1 ได้
Avid Learner

มันยากที่จะเข้าใจสิ่งที่จริงแล้วคุณกำลังทำอะไรอยู่โดยไม่มีการเข้าถึงวันที่เธอกำลังใช้และตัวแปรคุณต้องกำหนดไว้ที่อื่น ปัญหาก็คืออาจจะนั่นกันและการประมวลผลกลุ่มภาพยังไม่มีรูปภาพทั้งหมดเดียวกันรูปร่างดี
AloneTogether

Avid Learner

ในภาษาอื่นๆ

หน้านี้อยู่ในภาษาอื่นๆ

Русский
..................................................................................................................
Italiano
..................................................................................................................
Polski
..................................................................................................................
Română
..................................................................................................................
한국어
..................................................................................................................
हिन्दी
..................................................................................................................
Français
..................................................................................................................
Türk
..................................................................................................................
Česk
..................................................................................................................
Português
..................................................................................................................
中文
..................................................................................................................
Español
..................................................................................................................
Slovenský
..................................................................................................................

ดังอยู่ในนี้หมวดหมู่

ดังคำถามอยู่ในนี้หมวดหมู่