3

我正在 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

有没有办法指定我希望将转换应用于两个元素中的哪个元素?

4

2 回答 2

1

我只是遇到了同样的问题。最终解决方案是将数据加载为 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))
于 2020-05-10T15:58:05.680 回答
0

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

my_data = tf.data.Dataset(....) # with whatever arguments you use here
my_data = my_data.batch(1)
于 2020-03-30T17:14:22.037 回答