Как свернуть 2-мерное изображение, тензорная глубина 3, используя линейный слой? (в PyTorch) - PullRequest
0 голосов
/ 07 мая 2020

Дана тензорная форма (3, 256, 256). Я хотел бы свернуть или l oop через него пиксель за пикселем, чтобы вернуть мне тензорную форму (1, 256, 256).

Это может показаться немного запутанным, поэтому вот мой код до сих пор, чтобы вы Знаю, я имею в виду.

class MorphNetwork(nn.Module):
    def __init__(self):
        super().__init__()

        self.fc1 = nn.Linear(3, 8)
        self.fc2 = nn.Linear(8, 1)

    def forward(self, x):
        # The input here is shape (3, 256, 256)
        x = F.relu(self.fc1(x))
        x = self.fc2(x)
        # Returned shape should be (1, 256, 256)
        return x

Как вы можете видеть, мой Линейный слой принимает форму 3, которая соответствует глубине моего исходного тензора. Как лучше всего перебрать все 256x256, чтобы вернуть мне тензорную форму (1, 256, 256)

Ответы [ 2 ]

1 голос
/ 07 мая 2020

Линейный слой, который принимает входные данные 3dim и выдает 8dim, математически эквивалентен свертке с ядром пространственного размера 1x1 (я настоятельно рекомендую вам на самом деле «посчитать» и убедить себя, что это действительно правильно).

Следовательно, вы можете использовать следующую модель, заменив линейные слои на nn.Conv2D:

class MorphNetwork(nn.Module):
    def __init__(self):
        super().__init__()

        self.c1 = nn.Conv2d(3, 8, kernel_size=1, bias=True)
        self.c2 = nn.Conv2d(8, 1, kernel_size=1, bias=True)

    def forward(self, x):
        # The input here is shape (3, 256, 256)
        x = F.relu(self.c1(x))
        x = self.c2(x)
        # Returned shape should be (1, 256, 256)
        return x

Если вы настаиваете на использовании слоя nn.Linear, вы может unfold ваш ввод, а затем unfold его обратно после применения линейного слоя.

0 голосов
/ 07 мая 2020

Вы можете сделать что-то вроде этого,

Screenshot

Однако код, который я написал, специально c для ваших форм, вы можете очень легко обобщить код так, чтобы он имел произвольную форму на входе.

Вы можете найти записную книжку здесь https://github.com/swapnilskumbhar/StackOverflow_answers/tree/master/Convolution_linear_Layer

...