PyTorch 有一个所谓的动态计算图 https://medium.com/intuitionmachine/pytorch-dynamic-computational-graphs-and-modular-deep-learning-7e7f89f18d1 (其他解释 https://ai.stackexchange.com/questions/3801/what-is-a-dynamic-computational-graph).
它允许神经网络的图在训练或推理过程中动态适应其输入大小,从一个输入到下一个输入。
这是您在第一个示例中观察到的内容:提供图像作为大小张量[1, 3, 384, 320]
到你的模型,然后另一个作为大小张量[1, 3, 384, 1024]
等等,完全没问题,因为对于每个输入,您的模型都会动态适应。
但是,如果您的输入实际上是输入的集合(一批),那就是另一回事了。对于 PyTorch,一批将被转换为具有一个额外维度的单个张量输入。例如,如果您提供 n 个图像的列表,每个图像的大小[1, 3, 384, 320]
,PyTorch 会将它们堆叠在一起,以便您的模型具有单个张量输入,其形状[n, 1, 3, 384, 320]
.
这种“堆叠”只能发生在相同形状的图像之间。为了提供比之前的答案更“直观”的解释,这种堆叠操作不能在不同形状的图像之间完成,因为网络无法“猜测”不同图像在一批中应该如何彼此“对齐”,如果它们不是全部大小相同。
无论是在训练还是测试期间发生,如果您使用不同大小的图像创建批次,PyTorch 都会拒绝您的输入.
通常使用几种解决方案:像您一样进行重塑、添加填充(通常在图像边框上添加较小的值或空值)以将较小的图像扩展到最大图像的大小,等等。