我有一个用PyTorch编写的编码器-解码器回归网络,该网络将RGB图像作为输入。输出是2D图像,应该具有与输入相同的大小。
对于基于补丁的分析,我使用224x224大小的rgb补丁,一切正常。但是,当涉及到诸如681x1024或777x900之类的可变大小输入时,事情开始变得混乱。因为输出大小几乎总是不等于输入大小,这使我无法实现我想要的结构。这是原因:
让我们说我想建立一个像上面(taken from this paper)这样的多分支混合融合网络。在此网络中,全局分支的输出之一成为本地分支的输入的一部分。换句话说, GUIDANCE MAP的大小应等于LIDAR图像。
现在,我的意图是在可变大小的输入中具有相同的功能。我的两个分支都有结构
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 ...
我知道这些大小更改是由TransposedConv2d函数无法恢复分辨率所导致的,而该分辨率已被MaxPool2d以精确的精度降低了。但是我想知道是否有一种方法可以显式动态地恢复大小。
TLDR;我想针对具有不均匀尺寸(例如681x1024或777x900)的输入使用TransposedConv2d恢复由MaxPool2d降低的图像分辨率。
感谢您的帮助或建议。