Um loop de treinamento repete a passagem forward, o cálculo da perda, a passagem backward e o passo do otimizador entre batches e épocas. Schedulers ajustam a taxa de aprendizado; checkpoints preservam o progresso para retomada e implantação.
Cartão de receita de referência rápida - pronto para copiar e colar.
for epoch in range(num_epochs): model.train() for x, y in train_loader: x, y = x.to(device), y.to(device) optimizer.zero_grad(set_to_none=True) loss = loss_fn(model(x), y) loss.backward() optimizer.step() scheduler.step()
Quando usar isso:
Todo modelo PyTorch precisa de um loop de treinamento (a menos que use Lightning).
Implementando passes de validação, early stopping e checkpointing.
Ajustando schedules de taxa de aprendizado e gradient clipping.
# Acumulação de gradiente para tamanho de batch efetivo grandeaccum_steps = 4for i, (x, y) in enumerate(train_loader): loss = loss_fn(model(x), y) / accum_steps loss.backward() if (i + 1) % accum_steps == 0: optimizer.step() optimizer.zero_grad(set_to_none=True)
Não chamar model.eval() para validação - dropout randomiza e batch norm usa estatísticas do batch. Correção:model.eval() antes da validação; model.train() antes do treino.
Registrar perda sem média - perdas de batch brutas são ruidosas. Correção: acumular loss.item() * batch_size e dividir pelo tamanho do dataset.
Chamar scheduler a cada batch vs época - forma incorreta do schedule. Correção: corresponder ao tipo de scheduler (step() por época para CosineAnnealingLR).
Sem checkpoint na melhor validação - perde o melhor modelo se o treinamento continuar e ocorrer overfitting. Correção: salvar na melhoria da validação.
Taxa de aprendizado muito alta - perda NaNs ou diverge. Correção: começar com 1e-3 para Adam, 0.1 para SGD; usar warmup.
Esquecer de mover dados para o dispositivo - erros de incompatibilidade CPU/GPU. Correção:x.to(device, non_blocking=True) no loop.