Pytorch LSTM no entrenando
Entonces, actualmente estoy tratando de implementar un LSTM en Pytorch, pero por alguna razón la pérdida no está disminuyendo. Aquí está mi red:
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
Y mi ciclo de entrenamiento
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()
Y esto es lo que tengo
He estado tratando de buscar qué diablos estoy haciendo mal pero no tengo ni idea. Además, antes usaba un keras LSTM y funcionaba bien en el conjunto de datos.
¿Alguna ayuda? ¡Gracias!
Respuestas
Miras la pérdida en cada lote. Debe promediar su pérdida en todos los lotes. Cuando observa diferentes lotes, su pérdida puede aumentar simplemente porque un lote es más difícil de predecir que el otro. Por eso no es realmente interpretable. Así que empieza con eso. Si el problema persiste, probablemente se trate de gradientes explosivos. En ese caso, reducir su tasa de aprendizaje a 1e-3o 1e-4o incluso menos si continúa.