繁体   English   中英

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

[英]How to configure a tf.data.Dataset for variable size images?

我正在 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.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 的批次大小并尝试将两个不同形状/大小的图像放入一个批次中。 您可以将图像调整为固定形状(或填充图像),或使用批量大小为 1,如下所示:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM