Реализация одного ко многим LSTM / RNN, PyTorch

#pytorch #recurrent-neural-network

#pytorch #рекуррентная нейронная сеть

Вопрос:

У меня есть матрица размером m x n, и я хочу предсказать по 1 x n вектору (x на картинке со структурой сети) всю следующую (m-1) x n матрицу (y ^ {i} на картинке), используя RNN или LSTM, я не понимаю, какчтобы реализовать передачу каждого вектора 1 x n в следующее скрытое состояние и получить все (m-1) x n векторов одновременно и как вычислить ошибку по всем y ^ {i}

У меня есть эта ванильная RNN-модель, и я не знаю, как ее изменить

 class RNNModel(nn.Module):
def __init__(self, input_dim, hidden_dim, layer_dim, output_dim):
    super(RNNModel, self).__init__()
    
    self.hidden_dim = hidden_dim

    
    self.layer_dim = layer_dim

    
    # (batch_dim, seq_dim, feature_dim)
    self.RNN = nn.RNN(input_dim, hidden_dim, layer_dim, batch_first=True, nonlinearity='tanh')
    
    
    self.fc = nn.Linear(hidden_dim, output_dim)
    

def forward(self, x):
    # Initialize hidden state with zeros
    h0 = torch.zeros(self.layer_dim, x.size(0), self.hidden_dim).requires_grad_()

    
    out, h_t = self.RNN(x, h0)
    
    #out = self.fc(h_t[:, -1, :]) 
    out = self.fc(out[:, -1, :]) 
    
    return out
  

Ответ №1:

Стейнли, попробуй это: вы инициируете скрытое состояние, только если другое скрытое состояние не передается. затем вы возвращаете скрытое состояние и передаете его forward() на следующей итерации.

 def forward(self, x, h=None):
    
    if h is None: # if no hidden state is passed
        h = torch.zeros(  # Initialize hidden state with zeros
            self.layer_dim, x.size(0),
            self.hidden_dim).requires_grad_()

    out, h_t = self.RNN(x, h)
    out = self.fc(out[:, -1, :]) 
    return out, h_t
  

в обучающем коде вы запускаете цикл следующим образом::

 x = seed 
h = None
for i in range (...)
    optimizer.zero_grad()
    ...
    x, h = model.forward (x, h)
    ...
    loss = ...
    loss.backward()
    optimizer.step()