Deep learning 将自适应平均2d池替换为常规平均2d池

Deep learning 将自适应平均2d池替换为常规平均2d池,deep-learning,pytorch,onnx,Deep Learning,Pytorch,Onnx,我有一个PyTorch模型,它以以下方式使用自适应平均池层: ppms = [] for ii in [1, 3, 5]: ppms.append(nn.Sequential( nn.AdaptiveAvgPool2d(ii), nn.Conv2d(512, 512, 1, 1, bias=False), nn.ReLU(inplace=True))) self.ppms = nn.Modu

我有一个PyTorch模型,它以以下方式使用自适应平均池层:

ppms = []
for ii in [1, 3, 5]:
    ppms.append(nn.Sequential(
                nn.AdaptiveAvgPool2d(ii),
                nn.Conv2d(512, 512, 1, 1, bias=False),
                nn.ReLU(inplace=True)))

self.ppms = nn.ModuleList(ppms)
我想将此模型调整为固定的输入大小,以便以后将其转换为ONNX格式。我假设输入张量形状为3 x 1600 x 1000(通道x宽度x高度)。因此,我将
nn.AdaptiveAvgPool2d(ii)
替换为
nn.AvgPool2d((1000//ii,1600//ii))
。 我还验证了平均池的输入形状是整个模型的输入形状-(3x1600x100)

此外,我已经(在别处)验证了两个版本合并后的输出张量形状是相同的

但是,当我运行torch.onnx.export时,第二个版本崩溃,出现一个异常:

文件“C:\REPOSITORIES\poolnet2TF\venv\lib\site packages\torch\nn\modules\pooling.py”,第599行,向前 self.padding、self.ceil\u mode、self.count\u include\u pad、self.divisior\u override) 运行时错误:给定输入大小:(512x63x101)。计算输出大小:(512x0x0)。输出大小太小


这意味着与我的假设相反,两个版本合并后的输出张量是不同的。发生了什么?

您需要使用平均池层的输入形状,而不是模型的输入!平均池层的输入形状是模型的输入形状。这也得到了证实。谢谢,我会更新这个问题。你也可以添加整个模型定义吗?它就在问题的链接中。我尝试了一下,除了onnx似乎还没有实现的双线性外,我没有遇到任何关于默认arch的问题!您使用的是哪个版本的pytorch?你是怎么转换的?您是否指定了特定的op版本?您需要使用平均池层的输入形状,而不是模型的输入!平均池层的输入形状是模型的输入形状。这也得到了证实。谢谢,我会更新这个问题。你也可以添加整个模型定义吗?它就在问题的链接中。我尝试了一下,除了onnx似乎还没有实现的双线性外,我没有遇到任何关于默认arch的问题!您使用的是哪个版本的pytorch?你是怎么转换的?您是否指定了特定的op版本?