Несоответствие размера convLSTM

Я пытаюсь реализовать только одну ячейку сверточного LSTM и передать в ней тензор (1,3,128,128). Я получаю ошибку несоответствия размера.


    class ConvLSTMCell(nn.Module):
        def __init__(self, input_size, input_dim, hidden_dim, kernel_size, bias):
            """
            Parameters
            ----------
            input_size: (int, int)
                Height and width of input tensor as (height, width).
            input_dim: int
                Number of channels of input tensor.
            hidden_dim: int
                Number of channels of hidden state.
            kernel_size: (int, int)
                Size of the convolutional kernel.
            bias: bool
                Whether or not to add the bias.
            """
            super(ConvLSTMCell, self).__init__()

            self.height, self.width = input_size
            self.input_dim  = input_dim
            self.hidden_dim = hidden_dim

            self.kernel_size = kernel_size
            # self.padding     = kernel_size[0] // 2, kernel_size[1] // 2
            self.bias        = bias

            self.conv = nn.Conv2d(in_channels=self.input_dim + self.hidden_dim,
                              out_channels=4 * self.hidden_dim,
                              kernel_size=self.kernel_size,
                              #padding=self.padding,
                              bias=self.bias)

        def forward(self, input, prev_state):
            h_prev, c_prev = prev_state
            print('x: {}\nh_prev: {}\nc_prev: {}'.format(x.size(), h_prev.size(), c_prev.size()))
            combined = torch.cat((input, h_prev), dim=1) # concatenate along channel axis
            print('combined: {}'.format(combined.size()))

            combined_conv = self.conv(combined)
            print('combined_conv: {}'.format(combined_conv.size()))
            cc_i, cc_f, cc_o, cc_g = torch.split(combined_conv, self.hidden_dim, dim=1)
            print('cc_i: {}\ncc_f: {}\ncc_o: {}\ncc_g: {}'.format(cc_i.size(), cc_f.size(),   cc_o.size(), cc_g.size()))

            i = torch.sigmoid(cc_i)
            f = torch.sigmoid(cc_f)
            o = torch.sigmoid(cc_o)
            g = torch.tanh(cc_g)
            print('i: {}\nf: {}\no: {}\ng: {}'.format(i.size(), f.size(), o.size(), g.size()))

            c_cur = f * c_prev + i * g
            h_cur = o * F.tanh(c_cur)
            print('c_cur: {}\nh_cur: {}'.format(c_cur.size(), h_cur.size()))

            return h_cur, c_cur

        def init_hidden(self, batch_size):
            return (Variable(torch.zeros(batch_size, self.hidden_dim, self.height, self.width)),
                    Variable(torch.zeros(batch_size, self.hidden_dim, self.height, self.width)))



    x = torch.randn(1,3,128,128)
    model = ConvLSTMCell(input_size=(128,128), input_dim=3, hidden_dim=3, kernel_size=(5,5),
                         bias=True)
    hc = model.init_hidden(batch_size=1)
    if gpu:
        x.cuda()
        model.cuda()
        hc.cuda()

    out = model(x, hc)
    print(out.size())

Я получаю следующую ошибку:

x: torch.Size ([1, 3, 128, 128])

h_prev: torch.Size ([1, 3, 128, 128])

c_prev: torch.Size ([1, 3, 128, 128])

комбинированный: torch.Size ([1, 6, 128, 128])

комбинированный_конв: torch.Size ([1, 12, 124, 124])

cc_i: torch.Size ([1, 3, 124, 124])

cc_f: torch.Size ([1, 3, 124, 124])

cc_o: torch.Size ([1, 3, 124, 124])

cc_g: torch.Size ([1, 3, 124, 124])

i: torch.Size ([1, 3, 124, 124])

f: размер факела ([1, 3, 124, 124])

o: torch.Size ([1, 3, 124, 124])

g: torch.Size ([1, 3, 124, 124])

Отслеживание (последний вызов последний):

Файл trial.py, строка 87, в

out = модель (x, hc)

Файл /Users/abcde/opt/anaconda3/envs/matrix/lib/python3.7/site-packages/torch/nn/modules/module.py, строка 541, в вызове

результат = self.forward (* ввод, ** kwargs)

Файл trial.py, строка 66, вперед

c_cur = f * c_prev + i * g

RuntimeError: размер тензора a (124) должен соответствовать размеру тензора b (128) в не-одноэлементном ›измерении 3.

Я хочу построить сеть из 17 ячеек, используя это, и я хочу использовать выходные данные каждой ячейки, чтобы вычислить потери относительно наземной истины. Настоящая правда - 18 (3,128,128) изображений.

Как заставить мою сеть выводить скрытые состояния одинакового размера?


person 3venthoriz0n    schedule 25.11.2019    source источник


Ответы (1)


Ваши выходные данные меньше из-за эффектов границы - операция свертки вычисляет значения только в координатах, где ядро ​​может полностью вписаться в форму ввода. Самым простым решением было бы применить padding к вашему сверточному слою (который вы, кажется, уже пробовали, было ли что-то не так?). Если ваше ядро ​​имеет размер 5, вы должны дополнить его на 2, и тогда вывод свертки будет той же формы, что и ввод.

person Jatentaki    schedule 25.11.2019
comment
Не могу поверить, что не помню, чтобы комментировал эту часть: | , Спасибо, что заметили. Это сработало! Я работал над множеством проектов одновременно, так что, должно быть, я это пропустил. - person 3venthoriz0n; 26.11.2019