Можно ли обрезать/изменять размер изображений за пакет ?
Я использую API набора данных Tensorflow, как показано ниже:
dataset = dataset.shuffle().repeat().batch(batch_size, drop_remainder=True)
Я хочу, чтобы в пакете все изображения имели одинаковый размер. Однако в разных партиях он может иметь разные размеры.
Например, 1-я партия содержит все изображения формы (размер пакета, 300, 300, 3). Следующая партия может содержать изображения формы (размер пакета, 224, 224, 3). Другая партия может иметь изображения формы (размер пакета, 400, 400, 3).
В принципе, я хочу, чтобы пакеты имели симметричную форму, однако все изображения в пакете имеют статические формы.
Если мы поступим так, как следует:
dataset = dataset.shuffle().repeat().batch(batch_size, drop_remainder=True).map(lambda x, y: map_fn(x, y))
Применяется ли вышеуказанная функция .map() к каждому пакету отдельно или ко всему набору данных ?
Если выше .map() не применяется к каждой партии отдельно, как мы можем это сделать ? Можем ли мы определить любой итератор после dataset.batch(), применить tf.image.crop_and_resize() к каждому изображению в пакете, а затем использовать dataset.concatenate() для объединения всех преобразованных пакетов ?
Я создаю набор данных, как показано ниже:
# 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]
Несмотря на то, что я дал РАЗМЕР = (300, 300) в tf.image.resize(изображения, РАЗМЕР), пакет имеет РАЗМЕР = (480, 640). И поскольку следующее изображение имеет другой РАЗМЕР = (640, 426), его не удалось добавить в пакет. Это означает, что каким-то образом он не может применить функцию .map() к каждой отдельной партии. Есть какая-нибудь помощь/идея ?