Tensorflow数据集:使用不同形状的数据进行批处理

时间:2020-01-07 14:06:44

标签: tensorflow tensorflow-datasets

import tensorflow_datasets as tfds
import tensorflow as tf

def input_fn():

    dataset_builder = tfds.builder("oxford_flowers102")
    dataset_builder.download_and_prepare()

    ds = dataset_builder.as_dataset(split=tfds.Split.TRAIN)
    ds = ds.repeat()
    ds = ds.batch(32)
    return ds

将导致

InvalidArgumentError: Cannot batch tensors with different shapes in component 1. 
First element had shape [500,666,3] and element 1 had shape [752,500,3]. 
[Op:IteratorGetNextSync]

这可以通过使用调整大小/填充功能来解决,该功能返回herehere所示的相同形状的图像

ds = ds.map(resize_or_pad_function)
ds = ds.batch(...)

但是,我不想调整图像大小或填充图像,因为我想保留图像的原始大小和外观。它用于训练可以接受各种图像尺寸的卷积神经网络。

如果我需要一批(32, None, None, 3)形状的张量,每个图像的高度和宽度都不同,该怎么办?

1 个答案:

答案 0 :(得分:1)

在GPU中,通过将(具有相同形状的)张量传递到图形中来加快计算速度,其中在整个张量通过图形时对它们进行算术和逻辑运算(而不是一张一张地进行)。 tensorflow目前支持的AFAIK(即使有了Eager支持)。

这些张量应为零,并且可以完成计算,这就是我们将通过填充进行的操作。网络最终必须学会忽略由黑色区域引起的激活,因为它们不会随标签而变化。因此,必须执行以下一项操作:

  1. 裁剪图像
  2. 填充图像
  3. 两者的结合

其中任何一个必须返回任何给定批次的具有确定形状的张量。

尽管如此,仍然可能有一个神经网络在预测/评估阶段接受任何图像,因为它不会成批(实时运行)。

在培训过程中,避免

  1. 信息丢失:例如将2048 x 2048图片调整为28 x 28图片
  2. 填充过多:例如用零填充28 x 28的图像,使其变为2048 x 2048

最好将几乎相同大小的图像合并在一起,然后将数据集分成不同大小的批次(同时在任何批次中仍具有相同大小的图像),如@xenotecc在评论中所述。

到目前为止,在使用GPU加速计算的其他框架中也是如此。如有可能,请随时添加答案。

链接: