为什么 PyTorch 模型在模型内部采用多个图像尺寸?

Abh*_*kar 6 python machine-learning computer-vision deep-learning pytorch

我在 PyTorch 中使用一个简单的对象检测模型并使用 Pytoch 模型进行推理。

当我在代码上使用简单的迭代器时

for k, image_path in enumerate(image_list):
    image = imgproc.loadImage(image_path)
    print(image.shape)
    with torch.no_grad():
        y, feature = net(x)        
    result = image.cuda()
Run Code Online (Sandbox Code Playgroud)

它打印我们可变大小的图像,例如

torch.Size([1, 3, 384, 320])

torch.Size([1, 3, 704, 1024])

torch.Size([1, 3, 1280, 1280])
Run Code Online (Sandbox Code Playgroud)

因此,当我使用应用相同转换的 DataLoader 使用批量推理时,代码未运行。但是,当我将所有图像的大小调整为 600.600 时,批处理成功运行。

我有两个疑问,

首先,为什么 Pytorch 能够在深度学习模型中输入动态大小的输入,以及为什么动态大小的输入在批处理中失败。

Cle*_*ef. 7

PyTorch 具有所谓的动态计算图其他解释)。

它允许神经网络的图形在训练或推理期间动态适应其输入大小,从一个输入到下一个输入。这就是您在第一个示例中观察到的内容:将图像作为尺寸张量提供[1, 3, 384, 320]给模型,然后将另一个图像作为尺寸张量[1, 3, 384, 1024],依此类推,完全没问题,因为对于每个输入,您的模型将动态适应.

但是,如果您的输入实际上是输入的集合(一批),那就是另一回事了。对于 PyTorch,批处理将转换为具有一个额外维度的单个 Tensor 输入。例如,如果您提供一个包含 n 个图像的列表,每个图像的大小为[1, 3, 384, 320],PyTorch 会将它们堆叠起来,以便您的模型具有形状为 的单个张量输入[n, 1, 3, 384, 320]

这种“堆叠”只能发生在相同形状的图像之间。为了提供比以前的答案更“直观”的解释,不能在不同形状的图像之间进行这种堆叠操作,因为网络无法“猜测”不同的图像应该如何在一批中彼此“对齐”,如果它们不是都是一样的大小。

无论是在训练还是测试期间发生,如果您使用不同大小的图像创建批次,PyTorch 都会拒绝您的输入

通常使用几种解决方案:像您一样重新整形,添加填充(通常在图像边界上的小值或空值)以将较小的图像扩展到最大图像的大小,等等。