Делая PyTorch LSTM двунаправленным = Истинные причины: размер тензора a (322) должен соответствовать размеру тензора b (161) в не синглтонном измерении 2 - PullRequest
1 голос
/ 03 марта 2020

Моя модель:

class BaselineModel(nn.Module):
    def __init__(self, feature_dim=5, hidden_size=5, num_layers=2, seq_length=1, dropout=0.1):
        super(BaselineModel, self).__init__()
        self.num_layers = num_layers
        self.hidden_size = hidden_size
        self.seq_length = seq_length

        self.lstm = nn.LSTM(input_size=feature_dim,
                            hidden_size=hidden_size, num_layers=num_layers, dropout=0.1, bidirectional=False)

    def forward(self, x, hidden=None):
        lstm_out, hidden = self.lstm(x, hidden)
        return lstm_out, hidden

    def init_hidden(self, batch_size):
        hidden = torch.zeros(
            self.num_layers, self.seq_length, self.hidden_size)
        cell = torch.zeros(self.num_layers, self.seq_length,
                           self.hidden_size)
        return (hidden.float(), cell.float())

Все отлично работает. Мои входы и выходы имеют размерность torch.Size([32, 15, 161]), а мои hidden и cell имеют размерность torch.Size([2, 15, 161]).

Но когда я устанавливаю bidirectional=True, первое, что я должен сделать, - это мой init_hidden, измените self.num_layers на self.num_layers * 2. Что хорошо. Но затем, когда я выполняю свое обучение l oop, я получаю:

The size of tensor a (322) must match the size of tensor b (161) at non-singleton dimension 2

Это относится к строке, которая имеет loss = loss_fn(pred, outputs). Я использую loss_fn = torch.nn.MSELoss(reduction='sum'), если это имеет значение. Так что я делаю не так?

...