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]
这可以通过使用调整大小/填充功能来解决,该功能返回here和here所示的相同形状的图像
ds = ds.map(resize_or_pad_function)
ds = ds.batch(...)
但是,我不想调整图像大小或填充图像,因为我想保留图像的原始大小和外观。它用于训练可以接受各种图像尺寸的卷积神经网络。
如果我需要一批(32, None, None, 3)
形状的张量,每个图像的高度和宽度都不同,该怎么办?
答案 0 :(得分:1)
在GPU中,通过将(具有相同形状的)张量传递到图形中来加快计算速度,其中在整个张量通过图形时对它们进行算术和逻辑运算(而不是一张一张地进行)。 tensorflow目前支持的AFAIK(即使有了Eager支持)。
这些张量应为零,并且可以完成计算,这就是我们将通过填充进行的操作。网络最终必须学会忽略由黑色区域引起的激活,因为它们不会随标签而变化。因此,必须执行以下一项操作:
其中任何一个必须返回任何给定批次的具有确定形状的张量。
尽管如此,仍然可能有一个神经网络在预测/评估阶段接受任何图像,因为它不会成批(实时运行)。
在培训过程中,避免
最好将几乎相同大小的图像合并在一起,然后将数据集分成不同大小的批次(同时在任何批次中仍具有相同大小的图像),如@xenotecc在评论中所述。
到目前为止,在使用GPU加速计算的其他框架中也是如此。如有可能,请随时添加答案。
链接: