Python 如何在PyTorch中稳定TransposedConv2d的输出大小

Python 如何在PyTorch中稳定TransposedConv2d的输出大小,python,pytorch,deconvolution,max-pooling,Python,Pytorch,Deconvolution,Max Pooling,我有一个用PyTorch编写的编码器-解码器回归网络,它以RGB图像作为输入。输出是一个2D图像,应该与输入具有相同的大小 对于基于补丁的分析,我使用224x224大小的rgb补丁,一切正常。但当涉及到可变大小的输入(如681x1024或777x900)时,事情开始变得一团糟。因为输出大小几乎总是不等于输入大小,这阻碍了我实现我想要的结构。原因如下: 假设我想建立一个多分支、混合融合网络,如上所述()。在这个网络中,全局分支的一个输出成为本地分支输入的一部分。换句话说,引导地图的大小应该等于激

我有一个用PyTorch编写的编码器-解码器回归网络,它以RGB图像作为输入。输出是一个2D图像,应该与输入具有相同的大小

对于基于补丁的分析,我使用224x224大小的rgb补丁,一切正常。但当涉及到可变大小的输入(如681x1024或777x900)时,事情开始变得一团糟。因为输出大小几乎总是不等于输入大小,这阻碍了我实现我想要的结构。原因如下:

假设我想建立一个多分支、混合融合网络,如上所述()。在这个网络中,全局分支的一个输出成为本地分支输入的一部分。换句话说,引导地图的大小应该等于激光雷达图像。

现在,我的目的是对可变大小的输入具有相同的功能。我的两个分支具有相同的结构

self.global = nn.Sequential(Conv2d(3, 16, 9, same_padding=True, bn=bn),
                            nn.MaxPool2d(2),
                            Conv2d(16, 32, 7, same_padding=True, bn=bn),
                            nn.MaxPool2d(2),
                            Conv2d(32, 16, 7, same_padding=True, bn=bn),
                            Conv2d(16, 8, 7, same_padding=True, bn=bn),

                            DeConv2d(8, 8, 3, stride=2, same_padding=True),
                            Conv2d(8, 4, 7, same_padding=True, bn=bn),
                            DeConv2d(4, 4, 3, stride=2, same_padding=True),
                            Conv2d(4, 1, 4, same_padding=False, bn=bn))

self.local = nn.Sequential(Conv2d(3, 24, 5, same_padding=True, bn=bn),
                        nn.MaxPool2d(2),
                        Conv2d(24, 48, 3, same_padding=True, bn=bn),
                        nn.MaxPool2d(2),
                        Conv2d(48, 24, 3, same_padding=True, bn=bn),
                        Conv2d(24, 12, 3, same_padding=True, bn=bn),

                        DeConv2d(12, 12, 3, stride=2, same_padding=True),
                        Conv2d(12, 6, 3, same_padding=True, bn=bn),
                        DeConv2d(6, 6, 3, stride=2, same_padding=True),
                        Conv2d(6, 1, 4, same_padding=False, bn=bn))
当我需要对其输出进行融合时,它们工作正常,因为它们的输出大小相同。但是当我想将输入图像与全球网络的输出融合时,我得到了

runtime error : invalid argument 0: Sizes of tensors must match
except in dimension 1. 
Got 294 and 292 in dimension 2 at ...
我知道这些大小变化是由于TransposeConv2d函数无法恢复MaxPool2d精确降低的分辨率造成的。但我想知道是否有一种方法可以显式动态地恢复大小

TLDR;对于尺寸不均匀的输入,如681x1024或777x900,我想使用TransposeConv2d恢复由MaxPool2d降低的图像分辨率


我非常感谢任何帮助或建议。

这是我在keras上看到的,但我从未在pytorch Thoughmm上尝试过。所以他们使用插值。让我试试看这是否能解决我的问题。我的想法是使用一个image
resize
函数。我认为对于Pytork,可以将目标张量(292)转换为numpy,然后使用
cv2。批量调整
每个元素的大小,使其与源张量(294)相同,然后再转换回torch张量。这将非常缓慢。:/PyTorch有自己的调整张量大小的方法,所以不应该成为问题,我仍然可以使用插值。我关心的是,是否有可能通过(6801024)->(6811024)这样微小的大小更改来调整图像的大小。FWIW我要试一试