Un bucle de entrenamiento repite el pase hacia adelante, el cálculo de la pérdida, el pase hacia atrás y el paso del optimizador a través de lotes y épocas. Los planificadores ajustan la tasa de aprendizaje; los puntos de control preservan el progreso para la reanudación y el despliegue.
Tarjeta de receta de referencia rápida, lista para copiar y pegar.
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()
Cuándo usar esto:
Cada modelo de PyTorch necesita un bucle de entrenamiento (a menos que se use Lightning).
Implementar pases de validación, parada temprana y guardado de puntos de control.
Ajustar los planes de tasa de aprendizaje y el recorte de gradientes.
# Acumulación de gradientes para un tamaño de lote efectivo 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)
No llamar a model.eval() para la validación - dropout aleatoriza y batch norm usa estadísticas del lote. Solución:model.eval() antes de la validación; model.train() antes del entrenamiento.
Registrar la pérdida sin promediar - las pérdidas de lote crudas son ruidosas. Solución: acumular loss.item() * batch_size y dividir por el tamaño del conjunto de datos.
Pasar el planificador cada lote vs época - forma de planificador incorrecta. Solución: hacer coincidir el tipo de planificador (step() por época para CosineAnnealingLR).
Sin punto de control en la mejor validación - se pierde el mejor modelo si el entrenamiento continúa y se sobreajusta. Solución: guardar al mejorar la validación.
Tasa de aprendizaje demasiado alta - la pérdida se convierte en NaN o diverge. Solución: empezar con 1e-3 para Adam, 0.1 para SGD; usar calentamiento (warmup).
Olvidar mover los datos al dispositivo - errores de discrepancia CPU/GPU. Solución:x.to(device, non_blocking=True) en el bucle.