A saida do meu código:
Epoca Treino 0, Loss: 25.001370 +/- 6.0688
Epoca Teste 0, Loss: 30.498517 +/- 6.2475
Epoca Treino 1, Loss: 25.130966 +/- 6.1357
Epoca Teste 1, Loss: 27.439975 +/- 6.0469
Epoca Treino 2, Loss: 25.332942 +/- 6.1566
Epoca Teste 2, Loss: 28.626514 +/- 7.4235
Epoca Treino 3, Loss: 25.105736 +/- 6.0087
Epoca Teste 3, Loss: 27.001039 +/- 5.7841
Epoca Treino 4, Loss: 25.618906 +/- 6.2137
Epoca Teste 4, Loss: 26.893480 +/- 6.3790
Epoca Treino 5, Loss: 24.813476 +/- 5.9081
Epoca Teste 5, Loss: 27.344468 +/- 6.8285
Epoca Treino 6, Loss: 25.041727 +/- 6.3023
Epoca Teste 6, Loss: 27.237957 +/- 6.0613
Sendo que a cada iteração o erro deveria diminuir, pesquisei sobre e obtive a resposta "O erro está aumentando ou se mantendo instável, e a razão mais provável é a falta de normalização das suas features de entrada. Algumas features estão em escalas muito diferentes (por exemplo, hr de 0 a 23, temp de 0 a 1), o que cria uma superfície de perda "irregular" para o otimizador, dificultando a convergência."
Eu segui os códigos do curso, no colab, porém algumas coisas deram erro e eu pedi para o colab me mostra e ajeitar, não sei se foi ai que ele se perdeu e o erro começou a dar errado, enfim.
Meu código:
def treino(treino_loader,net,epoch_num):
net.train()
epoch_losses = [] # Lista para acumular as perdas desta época
for batch in treino_loader:
dado, rotulo = batch
dado = dado.to(args['device'])
rotulo = rotulo.to(args['device'])
# Zera os gradientes do otimizador
optimizer.zero_grad()
pred = net(dado)
loss = criterion(pred,rotulo)
epoch_losses.append(loss.item()) # Adiciona o valor escalar da perda à lista
loss.backward()
optimizer.step()
Calcula a média e o desvio padrão das perdas para a época atual
epoch_loss_array = np.asarray(epoch_losses)
print("Epoca Treino %d, Loss: %4f +/- %.4f" % (epoch_num, epoch_loss_array.mean(), epoch_loss_array.std()))
def teste(teste_loader,net,epoch_num):
net.eval()
with torch.no_grad():
epoch_losses = [] # Lista para acumular as perdas desta época
for batch in teste_loader:
dado, rotulo = batch
dado = dado.to(args['device'])
rotulo = rotulo.to(args['device'])
pred = net(dado)
loss = criterion(pred,rotulo)
epoch_losses.append(loss.item()) # Adiciona o valor escalar da perda à lista
# Calcula a média e o desvio padrão das perdas para a época atual
epoch_loss_array = np.asarray(epoch_losses)
print("Epoca Teste %d, Loss: %4f +/- %.4f" % (epoch_num, epoch_loss_array.mean(), epoch_loss_array.std()))
for epoch in range(args['num_epochs']):
treino(treino_loader,net,epoch)
teste(teste_loader,net,epoch)
print("---------------------------------------------------")