【发布时间】:2022-01-02 13:26:27
【问题描述】:
是否可以按批次裁剪/调整图像大小?
我正在使用 Tensorflow 数据集 API,如下所示:
dataset = dataset.shuffle().repeat().batch(batch_size, drop_remainder=True)
我希望,批次中的所有图像都应具有相同的大小。但是,在批次中,它可以有不同的大小。
例如,第 1 批具有所有形状为 (batch_size, 300, 300, 3) 的图像。下一批可以具有形状为 (batch_size, 224, 224, 3) 的图像。另一批可以具有形状为 (batch_size, 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)
【问题讨论】:
标签: python tensorflow tensorflow-datasets