Как применить линейный слой к 2D слою только в одном измерении (по строке или по столбцу) - частично связанные слои - PullRequest
2 голосов
/ 29 марта 2020

Я пытаюсь нанести линейный слой на 2D матрицу тензоров, соединяя его только по столбцу, как показано на рисунке ниже.

1D linear layer applied to 2D layer

Форма ввода: (batch_size, 3, 50) . Сначала я попробовал с двумерной сверткой, добавив измерение в 1 канал, поэтому форма ввода (batch_size, 1, 3, 50)

import torch.nn as nn
import torch

class ColumnConv(nn.Module):
    def __init__(self):
        self.layers = nn.Sequential(
            nn.Conv2d(
                in_channels=1,
                out_channels=1,
                kernel_size=(3, 1),
                stride=1,
            ),  # shape is B, 1, 1, 50
            nn.ReLU(),
            nn.Flatten() #shape is B, 50
        )

    def forward(self, x):
        return self.layers(x)

Но, похоже, это не работает. Я планирую использовать список из 50 nn.Linear слоев и применить их к входным фрагментам столбцов, но это выглядит скорее как обходной путь, не оптимизированный для производительности.

Есть ли еще " pytorchi c " как это сделать?

1 Ответ

2 голосов
/ 29 марта 2020

Модуль PyTorch nn.Linear может быть применен к многомерному вводу, линейный будет применен к последнему измерению, поэтому для применения по столбцам необходимо поменять местами строки и столбцы.

linear_3_to_1 = nn.Linear(3, 1)

x = torch.randn(1, 1, 3, 50)
x = x.transpose(2, 3) #swap 3 and 50
out = linear_3_to_1(x).flatten()
...