擅长:python、mysql、java
<p>PyTorch有所谓的<a href="https://medium.com/intuitionmachine/pytorch-dynamic-computational-graphs-and-modular-deep-learning-7e7f89f18d1" rel="noreferrer">Dynamic Computational Graph</a>(<a href="https://ai.stackexchange.com/questions/3801/what-is-a-dynamic-computational-graph">other explanation</a>)</p>
<p>它允许神经网络的图形在训练或推理期间动态地适应其输入大小,从一个输入到下一个输入。
这是您在第一个示例中观察到的:将图像作为大小为<code>[1, 3, 384, 320]</code>的张量提供给您的模型,然后将另一个图像作为大小为<code>[1, 3, 384, 1024]</code>的张量,依此类推,这是完全正确的,因为对于每个输入,您的模型都将动态调整</p>
<p>但是,如果您的输入实际上是输入的集合(一个批),那就另当别论了。对于Pytork,一个批次将被转换为具有一个额外维度的单个张量输入。例如,如果您提供一个n个图像的列表,每个图像的大小为<code>[1, 3, 384, 320]</code>,PyTorch将堆叠它们,以便您的模型有一个<code>[n, 1, 3, 384, 320]</code>形状的张量输入</p>
<p>这种“堆叠”只能发生在相同形状的图像之间。为了提供比以前的答案更“直观”的解释,这种堆叠操作不能在不同形状的图像之间进行,因为网络无法“猜测”不同图像在一批中应该如何“对齐”,如果它们的大小不同的话</p>
<p><strong>无论是在培训或测试期间发生,如果您使用不同大小的图像创建了一批图像,PyTorch将拒绝您的输入</p>
<p>通常会使用几种解决方案:按原样进行重塑,添加填充(通常在图像的边框上添加小值或空值),以将较小的图像扩展到最大图像的大小,等等</p>