Tensorflow数据集:使用不同形状的数据进行批处理 将tensorflow_数据集作为TFD导入 导入tensorflow作为tf def输入_fn: dataset_builder=tfds.builderoxford_flowers102 dataset\u builder.download\u和\u prepare ds=dataset\u builder.as\u datasetsplit=tfds.Split.TRAIN ds=ds.repeat ds=ds.32 返回ds

Tensorflow数据集:使用不同形状的数据进行批处理 将tensorflow_数据集作为TFD导入 导入tensorflow作为tf def输入_fn: dataset_builder=tfds.builderoxford_flowers102 dataset\u builder.download\u和\u prepare ds=dataset\u builder.as\u datasetsplit=tfds.Split.TRAIN ds=ds.repeat ds=ds.32 返回ds,tensorflow,tensorflow-datasets,Tensorflow,Tensorflow Datasets,将导致 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] 这可以通过使用resize/pad函数来解决,该函数返回与所示和所示形状相同的图像 但是,我不想调整图像大小或填充图像,因为我希

将导致

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]
这可以通过使用resize/pad函数来解决,该函数返回与所示和所示形状相同的图像

但是,我不想调整图像大小或填充图像,因为我希望保留图像的原始大小和外观。它是用来训练一个卷积神经网络,可以接受不同大小的图像


如果我需要一批形状为32、无、无、3的张量,其中每个图像具有不同的高度和宽度,我该怎么办?

在GPU中,通过将相同形状的张量传递到图形中来加速计算,其中,算术和逻辑运算是在整个张量上进行的,而不是一个接一个地进行。好吧,这就是tensorflow目前所支持的内容,即使有迫切的支持

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

裁剪图像 填充图像 两者的结合 其中任何一个都必须返回一个张量,该张量具有给定批次的确定形状

尽管如此,仍有可能在预测/评估阶段使用接受任何图像的神经网络,因为这在实时运行时不会成批运行

在训练期间,要避免

信息丢失:例如,将2048 x 2048图像调整为28 x 28图像 过度填充:例如,用零填充28 x 28图像,使其成为2048 x 2048 最好将几乎相同大小的图像集中在一起,并将数据集拆分为不同大小的批,同时在任何批中仍具有相同大小的图像,如@xenotecc在评论中所述

这在目前使用GPU加速计算的其他框架中也是如此。如果可能,请随意添加答案

链接:

TF图
可悲的是,这并非小事。使用Tensorflow数据集时,所有条目的Tensor形状必须相等。您可以尝试将数据集拆分为更小的数据集,每个数据集作为一批不同形状的张量。但这是一个相当混乱的解决方法,而不是直接的解决方案。
ds = ds.map(resize_or_pad_function)
ds = ds.batch(...)