Pessoal, compartilho aqui meu notebook da última aula do curso. Mantive a estrutura do material e adicionei mecanismos de reprodutibilidade e treino mais robusto (early stopping + restauração do melhor estado).
- Notebook do curso (original): https://github.com/alura-cursos/1563-treinando-pytorch/blob/aula-05/Carregamento%20de%20Dados%20II.ipynb
- Minha versão: https://github.com/carlosvblessa/treinando-pytorch/blob/main/05-CarregamentoDeDados2.ipynb
O que foi alterado/melhorado
- Restauração do melhor modelo: importei
copy
e salvo uma cópia profunda destate_dict()
quando a val loss melhora; no fim do treino, restauro os melhores pesos. - Hiperparâmetros:
lr=1e-3
,weight_decay=1e-5
,early_stopping_patience=20
. - Seeds globais:
torch.manual_seed
,np.random.seed
,torch.cuda.manual_seed_all
(quando aplicável). - Escalonamento: uso
StandardScaler
apenas nas features, mantendo o alvo na escala original; isso ajuda a estabilizar gradientes antes de reduzir a taxa de aprendizado. - Early stopping: monitora a menor loss de validação, interrompe após 20 épocas sem melhora real e restaura os pesos da “época campeã”.
Resultados (resumo dos logs)
Local (CPU)
- Melhor época: 185 — val loss 28.6814.
- Treino foi até a época 199 (limite), e no final restaurei o estado da época 185.
Colab (GPU / CUDA)
- Early stopping ativado na época 132.
- Melhor época: 112 — val loss 27.6826.
- Modelo restaurado para a época 112.
Os tempos por época e desvios padrão estão nos logs do notebook.
Nota sobre reprodutibilidade
Mesmo com seeds fixas, ao usar DataLoader(num_workers>0)
os batches podem ser embaralhados em threads diferentes; além disso, CPU x GPU podem divergir levemente (FMA, kernels do cuDNN, etc.). Por isso é comum a “época campeã” mudar entre ambientes.
Espero que ajude quem está fechando o curso e quer métricas/logs mais confiáveis para comparar execuções.