0

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

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

多分支、混合融合网络

假设我想建立一个像上面这样的多分支混合融合网络(取自本文)。在这个网络中,全局分支的输出之一成为本地分支输入的一部分。换句话说,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;我想使用 TransposedConv2d 恢复 MaxPool2d 降低的图像分辨率,用于大小不均匀的输入,例如 681x1024 或 777x900。

我感谢任何帮助或建议。

4

0 回答 0