Week 91 - Entrenamiento en caliente
Estratificación del dataset
Para modelar los estados de conducción se definió una estratificación conjunta steer × throttle, generando 20 clases discretas.
Clasificación del steer
| Clase | Descripción |
|---|---|
| 0 | fuerte izquierda |
| 1 | suave izquierda |
| 2 | recto |
| 3 | suave derecha |
| 4 | fuerte derecha |
Clasificación del throttle
| Clase | Descripción |
|---|---|
| 0 | muy lento |
| 1 | lento |
| 2 | medio |
| 3 | muy rápido |
Cada muestra se asigna a una clase:
class_20 = steer_class × 4 + throttle_class
Esto permite diferenciar estados como:
- recto + velocidad alta
- giro suave + velocidad media
- giro fuerte + desaceleración
Distribución natural del dataset
El análisis inicial mostró una fuerte concentración en:
- conducción recta
- velocidades medias y altas
Mientras que los estados críticos estaban pobremente representados:
- giros fuertes
- recuperación de carril
- bajas velocidades
Este patrón es coherente con conducción humana continua.
Balanceo en caliente
Se utilizó WeightedRandomSampler en PyTorch para modificar la probabilidad de selección de muestras durante el entrenamiento.
Principios:
- no eliminar datos reales
- no duplicar físicamente el dataset
- aumentar la exposición del modelo a estados críticos
Así, el dataset permanece intacto, pero el modelo observa una distribución controlada en cada batch.
Distribución objetivo de conducción
Se definió una distribución inspirada en conducción realista:
| Tipo de conducción | Frecuencia objetivo |
|---|---|
| fuerte izquierda | 4–6 % |
| suave izquierda | 12–18 % |
| recto | 50–60 % |
| suave derecha | 12–18 % |
| fuerte derecha | 4–6 % |
Esto mantiene el comportamiento natural dominante en recta, pero incrementa la presencia de:
- giros
- correcciones
- transiciones dinámicas
Cálculo de pesos
Para cada clase se calculó:
peso = frecuencia_objetivo / frecuencia_real
Luego se aplicó clipping de pesos para evitar inestabilidad:
- peso mínimo
- peso máximo
Esto previene:
- batches dominados por eventos extremos
- sobre-ajuste en clases raras
Función de pérdida multi-salida
El modelo PilotNet fue entrenado para predecir:
- steer
- throttle
Se utilizó una pérdida ponderada:
loss = w_steer · MSE_steer + w_throttle · MSE_throttle
Configuración:
| Parámetro | Valor |
|---|---|
| steer_loss_weight | 3 |
| throttle_loss_weight | 1 |
Esto prioriza la estabilidad lateral de la trayectoria.
Influencia de la frecuencia de muestreo del dataset
Se entrenaron modelos PilotNet con datasets recuperados a:
- 20 Hz
- 10 Hz
- 5 Hz
- 1 Hz
Observaciones
- El modelo entrenado a 20 Hz es el único que logra completar trayectorias de forma estable.
- Presenta aún un comportamiento ligeramente embrioso (oscilaciones suaves), pero sin zigzagueo severo.
- Los modelos entrenados con frecuencias menores muestran conducción aparentemente continua, pero terminan saliéndose del carril y colisionando.
Esto sugiere que:
- una alta resolución temporal es crítica para aprender la dinámica lateral
- la reducción excesiva de frecuencia degrada la capacidad de recuperación del modelo