具有图像维度的预测时间的 Faster-RCNN Pytorch 问题
Faster-RCNN Pytorch problem at prediction time with image dimensions
我正在根据本教程使用 PyTorch 微调 Faster-RCNN:https://pytorch.org/tutorials/intermediate/torchvision_tutorial.html
结果非常好,但只有在将单个张量输入模型时才能进行预测。例如:
# This works well
>>> img, _ = dataset_test[3]
>>> img.shape
torch.Size([3, 1200, 1600])
>>> model.eval()
>>> with torch.no_grad():
.. preds = model([img.to(device)])
但是当我一次输入多个张量时,我得到了这个错误:
>>> random_idx = torch.randint(high=50, size=(4,))
>>> images = torch.stack([dataset_test[idx][0] for idx in random_idx])
>>> images.shape
torch.Size([4, 3, 1200, 1600])
>>> with torch.no_grad():
.. preds = model(images.to(device))
RuntimeError Traceback (most recent call last)
<ipython-input-101-52caf8fee7a4> in <module>()
5 model.eval()
6 with torch.no_grad():
----> 7 prediction = model(images.to(device))
...
RuntimeError: The expanded size of the tensor (1600) must match the existing size (1066) at non-singleton dimension 2. Target sizes: [3, 1200, 1600]. Tensor sizes: [3, 800, 1066]
编辑
在输入 3D 张量列表时工作(IMO 这种行为有点奇怪,我不明白为什么它不能使用 4D 张量):
>>> random_idx = torch.randint(high=50, size=(4,))
>>> images = [dataset_test[idx][0].to(device) for idx in random_idx]
>>> images.shape
torch.Size([4, 3, 1200, 1600])
>>> with torch.no_grad():
.. preds = model(images)
MaskRCNN
在训练模式下期望张量列表为 'input images' 和字典列表为 'target'。这种特殊的设计选择是由于每个图像可以有可变数量的对象,即每个图像的目标张量将具有可变尺寸,因此我们被迫使用列表而不是目标的批量张量。
但是,使用图像张量列表而不是使用批处理张量仍然不是完全必要的。我的猜测是,为了保持一致性,他们也使用了图像张量列表。此外,这提供了一个额外的优势,即能够使用可变大小的图像而不是固定大小的图像作为输入。
由于这种特殊的设计选择,该模型在评估模式期间也需要张量列表作为输入。
至于模型的速度表现,这种设计选择在评估时可能会产生一些负面影响,但我不能百分百相信。然而,在训练过程中,由于每张图像的目标张量维度都是可变的,因此我们不得不一张一张地迭代所有图像以进行损失计算。因此,在训练期间在图像张量列表上使用批量图像张量不会提高速度。
我正在根据本教程使用 PyTorch 微调 Faster-RCNN:https://pytorch.org/tutorials/intermediate/torchvision_tutorial.html
结果非常好,但只有在将单个张量输入模型时才能进行预测。例如:
# This works well
>>> img, _ = dataset_test[3]
>>> img.shape
torch.Size([3, 1200, 1600])
>>> model.eval()
>>> with torch.no_grad():
.. preds = model([img.to(device)])
但是当我一次输入多个张量时,我得到了这个错误:
>>> random_idx = torch.randint(high=50, size=(4,))
>>> images = torch.stack([dataset_test[idx][0] for idx in random_idx])
>>> images.shape
torch.Size([4, 3, 1200, 1600])
>>> with torch.no_grad():
.. preds = model(images.to(device))
RuntimeError Traceback (most recent call last)
<ipython-input-101-52caf8fee7a4> in <module>()
5 model.eval()
6 with torch.no_grad():
----> 7 prediction = model(images.to(device))
...
RuntimeError: The expanded size of the tensor (1600) must match the existing size (1066) at non-singleton dimension 2. Target sizes: [3, 1200, 1600]. Tensor sizes: [3, 800, 1066]
编辑
在输入 3D 张量列表时工作(IMO 这种行为有点奇怪,我不明白为什么它不能使用 4D 张量):
>>> random_idx = torch.randint(high=50, size=(4,))
>>> images = [dataset_test[idx][0].to(device) for idx in random_idx]
>>> images.shape
torch.Size([4, 3, 1200, 1600])
>>> with torch.no_grad():
.. preds = model(images)
MaskRCNN
在训练模式下期望张量列表为 'input images' 和字典列表为 'target'。这种特殊的设计选择是由于每个图像可以有可变数量的对象,即每个图像的目标张量将具有可变尺寸,因此我们被迫使用列表而不是目标的批量张量。
但是,使用图像张量列表而不是使用批处理张量仍然不是完全必要的。我的猜测是,为了保持一致性,他们也使用了图像张量列表。此外,这提供了一个额外的优势,即能够使用可变大小的图像而不是固定大小的图像作为输入。
由于这种特殊的设计选择,该模型在评估模式期间也需要张量列表作为输入。
至于模型的速度表现,这种设计选择在评估时可能会产生一些负面影响,但我不能百分百相信。然而,在训练过程中,由于每张图像的目标张量维度都是可变的,因此我们不得不一张一张地迭代所有图像以进行损失计算。因此,在训练期间在图像张量列表上使用批量图像张量不会提高速度。