Pytorch скрытая ячейка LSTM с мини-пакетами - PullRequest
0 голосов
/ 26 марта 2020

Проблема

Я не понимаю, как обращаться со скрытыми ячейками LSTM при обучении в мини-пакетах, так как данные обучения отправляются в сеть партиями n последовательностей, в то время как только 1 последовательность обрабатывается каждый раз во время теста.

Код

В частности, моя сеть:

class Pytorch_LSTM(nn.Module):
    def __init__(self, params):
        super(Pytorch_LSTM, self).__init__()
        self.params = params
        self.hidden_layer_size = params['hidden_layer_size']
        # Define layers
        self.lstm = nn.LSTM(input_size = params['in_features'], hidden_size = params['hidden_layer_size'])        
        self.linear1 = nn.Linear(params['hidden_layer_size'], params['hidden_layer_size'])
        self.linear2 = nn.Linear(params['hidden_layer_size'], params['out_features'])
        self.hidden_cell = (torch.zeros(1,self.params['batch_size'],self.hidden_layer_size),
                           torch.zeros(1,self.params['batch_size'],self.hidden_layer_size))

    def forward(self, input_seq):        
        lstm_out, self.hidden_cell = self.lstm(input_seq.view(self.params['time_window'],-1,self.params['in_features']), self.hidden_cell)
        linear1_out = self.linear1(lstm_out)
        predictions = self.linear2(linear1_out)
        return predictions[-1]

В моем train() методе:

def train(self, input_sequence, params, test_idx, final, verbose=True):        

        ....
        ....

        # Model
        self.model = Pytorch_LSTM(params)
        # Let's train the model
        for epoch in range(epochs):
            for count_1,seq in enumerate(train_data_batch):      
                optimizer.zero_grad()
                self.model.hidden_cell = (torch.zeros(1, params['batch_size'], self.model.hidden_layer_size),
                                          torch.zeros(1, params['batch_size'], self.model.hidden_layer_size))   
                y_pred = self.model(seq)     # seq.shape: (n_batches, 25, 4)
                single_loss = mse_loss(y_pred, y_label)    # y_pred.shape, y_label.shape : (batch_size, 4)

Это тренирует модель в мини-сериях, я верю правильно.
Когда я проверяю это, у меня только одна последовательность за раз вместо нескольких партий. В моем test():

for count,seq in enumerate(val_data[j]):                   
    y_pred = self.model(seq)           # seq.shape: (25,4)
    single_loss = mse_loss(y_pred, y_label)

Это возвращает ошибку:

RuntimeError: Expected hidden[0] size (1, 1, 100), got (1, 704, 100)

, где n_batches = 704.

Как мне обращаться с hidden_cell

1 Ответ

0 голосов
/ 26 марта 2020

Вы передаете параметры (h_0, c_0) в lstm при каждом вызове формы (1, batch_size, 100). batch_size предназначен для параллельной обработки и является произвольным, но вы каждый раз жестко кодируете в

self.hidden_cell = (torch.zeros(1,self.params['batch_size'],self.hidden_layer_size),
                    torch.zeros(1,self.params['batch_size'],self.hidden_layer_size))

. Эти hidden_cell являются h_0 и c_0 параметрами, т.е. начальными значениями скрытого состояния и состояния ячейки.

Попытка передать массив размером (1, batch_size, 100) не требуется, поскольку по умолчанию равен нулю вектор требуемого размера сам по себе.

Просто избавьтесь от self.hidden_cell и только передайте input_seq методу self.lstm in forward. Должно работать

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...