Pytorch LSTM sem treinamento

Sep 22 2020

Atualmente, estou tentando implementar um LSTM no Pytorch, mas por algum motivo a perda não está diminuindo. Aqui está minha rede:

class MyNN(nn.Module):
    def __init__(self, input_size=3, seq_len=107, pred_len=68, hidden_size=50, num_layers=1, dropout=0.2):
        super().__init__()
        
        self.pred_len = pred_len
        
        self.rnn = nn.LSTM(
            input_size=input_size, 
            hidden_size=hidden_size, 
            num_layers=num_layers, 
            dropout=dropout, 
            bidirectional=True,
            batch_first=True
        )
        
        self.linear = nn.Linear(hidden_size*2, 5)
    
    def forward(self, X):
        lstm_output, (hidden_state, cell_state) = self.rnn(X)
        
        labels = self.linear(lstm_output[:, :self.pred_len, :])
        
        return lstm_output, labels

E meu loop de treinamento

LEARNING_RATE = 1e-2


net = MyNN(num_layers=1, dropout=0)

compute_loss = nn.MSELoss()

optimizer = optim.Adam(net.parameters(), lr=LEARNING_RATE)


all_loss = []
for data in tqdm(list(train_loader)):
    X, y = data
    
    optimizer.zero_grad()

    lstm_output, output = net(X.float())
    
    # Computing the loss
    loss = compute_loss(y, output)
    all_loss.append(loss)
    loss.backward()
    
    optimizer.step()
    
# Plot
plt.plot(all_loss, marker=".")
plt.xlabel("Epoch")
plt.xlabel("Loss")
plt.show()

E é isso que eu tenho

Tenho tentado descobrir o que diabos estou fazendo de errado, mas não tenho ideia. Além disso, antes eu usei um Keras LSTM e funcionou bem no conjunto de dados.

Qualquer ajuda? Obrigado!

Respostas

1 YuseqYaseq Sep 22 2020 at 20:10

Você vê a perda em cada lote. Você deve calcular a média de sua perda de todos os lotes. Quando você olha para diferentes lotes, sua perda pode aumentar simplesmente porque um lote é mais difícil de prever do que o outro. É por isso que não é realmente interpretável. Então comece com isso. Se o problema persistir, provavelmente está explodindo em gradientes. Nesse caso, diminua sua taxa de aprendizagem para 1e-3ou 1e-4ou até menos se continuar.