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

时间:2019-11-07 02:28:38

标签: python pytorch deconvolution max-pooling

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

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

Multi-Branch, Hybrid Fusion Network

让我们说我想建立一个像上面(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降低的图像分辨率。

感谢您的帮助或建议。

0 个答案:

没有答案