如何为可变大小的图像配置tf.data.Dataset



我正在Tensorflow 2.1上设置一个图像数据管道。我正在使用一个包含可变形状(h,w,3(的RGB图像的数据集,但我找不到让它工作的方法。当我调用tf.data.Dataset.batch():时,我得到以下错误

tensorflow.python.framework.errors_impl.InvalidArgumentError: Cannot batch tensors with different shapes in component 0. First element had shape [256,384,3] and element 3 had shape [160,240,3]

我找到了padded_batch方法,但我不希望我的图像被填充到相同的形状。

编辑:

我想我通过使用函数tf.data.experimental.dense_to_ragged_batch(将稠密张量表示转换为粗糙张量表示(找到了一个解决方法。

tf.data.Dataset.batch不同,要批处理的输入元素可能具有不同的形状,并且每个批都将被编码为tf.RaggedTensor

但是我有另一个问题。我的数据集包含图像及其相应的标签。当我使用这样的功能时:

ds = ds.map(
lambda x: tf.data.experimental.dense_to_ragged_batch(batch_size)
) 

我得到以下错误,因为它试图将函数映射到整个数据集(从而映射到图像和标签(,这是不可能的,因为它只能应用于1个单一张量(而不是2个(。

TypeError: <lambda>() takes 1 positional argument but 2 were given

有没有一种方法可以指定我希望将转换应用于这两个元素中的哪个元素?

我刚刚遇到了同样的问题。解决方案是将数据加载为2个数据集,然后使用dataet.zip((将它们合并。

images = dataset.map(parse_images, num_parallel_calls=tf.data.experimental.AUTOTUNE)
images = dataset_images.apply(
tf.data.experimental.dense_to_ragged_batch(batch_size=batch_size, drop_remainder=True))
dataset_total_cost = dataset.map(get_total_cost)
dataset_total_cost = dataset_total_cost.batch(batch_size, drop_remainder=True)
dataset = dataset.zip((dataset_images, dataset_total_cost))

如果您不想调整图像的大小,则只能使用1的批量大小,并且不能大于该批量大小。因此,您可以一次训练您的模型一个图像。您报告的错误清楚地表明,您使用的批次大小大于1,并试图在一个批次中放置两个不同形状/大小的图像。您可以将图像大小调整为固定形状(或填充图像(,也可以使用1的批量大小,如下所示:

my_data = tf.data.Dataset(....) # with whatever arguments you use here
my_data = my_data.batch(1)

最新更新