Как стабилизировать размер вывода TransposedConv2d в PyTorch - PullRequest
0 голосов
/ 07 ноября 2019

У меня есть регрессионная сеть кодер-декодер, написанная на PyTorch, которая принимает изображения RGB в качестве входных данных. Выходные данные - это двухмерное изображение, размер которого должен быть таким же, как у входного сигнала.

В случае анализа на основе исправлений, использующего rgb-исправления размером 224x224, все работает хорошо. Но когда дело доходит до вводов переменного размера, таких как 681x1024 или 777x900, все начинает запутываться. Поскольку размер вывода почти всегда не равен размеру ввода, и это мешает мне реализовать структуру, которую я намереваюсь. Вот почему:

Multi-Branch, Hybrid Fusion Network

Допустим, я хотел бы построить многоотраслевую гибридную сеть Fusion , как указано выше ( взято из этой статьи ). В этой сети один из выходов глобальной ветви становится частью входа локальной ветви. Другими словами, размер 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;Я хотел бы восстановить разрешение изображения, уменьшенное MaxPool2d, используя TransposedConv2d для входов с неравномерными размерами, такими как 681x1024 или 777x900.

Я ценю любую помощь или предложение.

...