Toplu iş başına görüntüleri kırpmak / yeniden boyutlandırmak mümkün mü ?
Aşağıdaki gibi Tensorflow veri kümesi API'sini kullanıyorum:
dataset = dataset.shuffle().repeat().batch(batch_size, drop_remainder=True)
Toplu iş içinde tüm görüntülerin aynı boyutta olmasını istiyorum. Bununla birlikte, gruplar arasında farklı boyutlara sahip olabilir.
Örneğin, 1. parti şeklin tüm görüntülerine sahiptir (batch_size, 300, 300, 3). Bir sonraki parti şekil görüntülerine sahip olabilir (batch_size, 224, 224, 3). Başka bir toplu iş, şekil görüntülerine sahip olabilir (batch_size, 400, 400, 3).
Temel olarak, dinamik olarak şekillendirilmiş partilere sahip olmak istiyorum, ancak parti içindeki tüm görüntülerin statik şekilleri var.
Eğer aşağıdaki gibi yaparsak:
dataset = dataset.shuffle().repeat().batch(batch_size, drop_remainder=True).map(lambda x, y: map_fn(x, y))
Yukarıdakileri yapar .map() her parti için ayrı ayrı mı yoksa tüm veri kümesi üzerinde mi uygulanır ?
Yukarıdaysa .map() her parti için ayrı ayrı geçerli değildir, bunu nasıl yapabiliriz ? Veri kümesinden sonra herhangi bir yineleyiciyi tanımlayabilir miyiz?batch(), tf uygulayın.görüntü.toplu iş başına her görüntünün üzerine crop_and_resize() ve daha sonra dataset kullanın.dönüştürülen tüm partileri birleştirmek için concatenate ()?
Veri kümesini aşağıdaki gibi oluşturuyorum:
# 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)
INVALID_ARGUMENT: Cannot add tensor to the batch: number of elements does not match. Shapes are: [tensor]: [640,426,3], [batch]: [480,640,3]
Tf'de SİZE = (300, 300) vermiş olmama rağmen.görüntü.yeniden boyutlandır(resimler, BOYUT), toplu iş BOYUTU = (480, 640). Ve bir sonraki görüntü farklı boyutta olduğu için = (640, 426), partiye eklenemedi. Bu, bir şekilde uygulanamayacağı anlamına geliyor .her bir partide map() işlevi. Herhangi bir yardım/fikir ?