Моя модель:
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')
, если это имеет значение. Так что я делаю не так?