Contenido del curso

Redes neuronales con PyTorch

Regresión lineal desde cero en PyTorch

Resumen

Crear un modelo de regresión lineal en PyTorch se logra usando nn.Module junto con parámetros entrenables como volumen y sesgo. Si ya construiste un Hola Mundo con PyTorch, este paso te resultará familiar: misma estructura, distintos bloques de Lego. Esta guía es para ti si estás empezando con redes neuronales y quieres entender cómo se arma un modelo desde cero.

¿Qué librerías necesito para construir un modelo en PyTorch?

Antes de escribir código, conviene tener claras las cuatro librerías base que sostienen casi cualquier proyecto en PyTorch.

  • torch.nn: clases y funciones para definir redes neuronales.
  • torch.optim: herramientas para optimizar el modelo durante el entrenamiento.
  • Dataset (de utils): representa tus datos en un formato compatible con PyTorch.
  • DataLoader (de utils): agrupa los datos en batches y los envía al modelo o a la GPU.

En esta etapa solo usarás las dos primeras, pero las cuatro forman el kit completo para flujos más serios.

¿Para qué sirve torch.nn en PyTorch? Es el módulo que contiene las clases base para construir redes neuronales, incluyendo nn.Module y nn.Parameter. Lo usas como punto de partida para definir cualquier modelo.

¿Cómo definir un modelo de regresión lineal con nn.Module?

Un modelo de regresión lineal en PyTorch necesita dos parámetros entrenables: volumen (la pendiente) y sesgo (el intercepto). Ambos se inicializan con valores aleatorios y se ajustan durante el entrenamiento.

¿Qué hace nn.Parameter dentro del modelo?

Usas nn.Parameter para indicarle a PyTorch que un tensor es entrenable. Eso significa que tendrá un gradiente asociado y podrá actualizarse en cada iteración del entrenamiento.

La estructura básica luce así:

python import torch from torch import nn

class RegresionLineal(nn.Module): def init(self): super().init() self.volumen = nn.Parameter(torch.randn(1, dtype=torch.float), requires_grad=True) self.sesgo = nn.Parameter(torch.randn(1, dtype=torch.float), requires_grad=True)

def forward(self, x: torch.Tensor) -> torch.Tensor: return self.volumen * x + self.sesgo

Nota un detalle importante: requires_grad=True activa el seguimiento del gradiente, que es la señal que indica si un peso debe crecer o disminuir para mejorar las predicciones.

¿Por qué usar torch.float y un tensor de dimensión 1?

Los pesos se entrenan mejor en formato float que en enteros, porque los ajustes son fracciones pequeñas. Y al ser una regresión lineal sencilla, basta con un escalar de dimensión uno para cada parámetro.

A diferencia del modelo Hola Mundo, aquí no le pides al usuario que ingrese valores iniciales: el modelo se inicializa solo con números aleatorios.

¿Cómo inicializar y reproducir el modelo con torch.manual_seed?

Antes de instanciar el modelo, conviene fijar una semilla para que los valores aleatorios sean reproducibles entre ejecuciones.

python torch.manual_seed(42) model1 = RegresionLineal()

El número 42 es arbitrario; lo importante es que cada vez que uses la misma semilla, los pesos iniciales serán idénticos. Esto es clave cuando quieres comparar experimentos o compartir resultados con otras personas.

¿Qué hace torch.manual_seed? Fija el generador de números aleatorios para que los valores iniciales se repitan en cada ejecución. Es buena práctica usarlo siempre que quieras reproducibilidad.

¿Qué es el state_dict y por qué importa?

Llamando a model1.state_dict() obtienes un OrderedDict con los pesos actuales del modelo. Por ejemplo, podrías ver algo como volumen: tensor([0.3367]) y sesgo: tensor([0.1288]), valores aleatorios producto de la semilla.

El state_dict te será fundamental más adelante para guardar y cargar modelos, porque almacena el valor exacto de cada peso entrenado.

¿Cómo hacer predicciones con un modelo sin entrenar?

Aunque el modelo todavía no aprende nada útil, ya puede generar predicciones. Para eso usas el modo de inferencia, que desactiva el cálculo del gradiente y hace todo más eficiente.

python with torch.inference_mode(): y_pred_c = model1(X_pred)

El inference_mode se usa cuando solo quieres predecir, no entrenar. El gradiente solo es necesario durante el entrenamiento, así que apagarlo ahorra memoria y cómputo.

Al graficar y_pred_c con Matplotlib junto a los datos de entrenamiento (verdes) y de prueba (amarillos), notarás que las predicciones en rojo están muy lejos de la línea esperada. No coinciden ni en pendiente ni en sesgo, y eso es completamente normal: el modelo arrancó con números aleatorios.

¿Qué cambió respecto al modelo Hola Mundo de PyTorch?

La estructura sigue siendo la misma: heredas de nn.Module, defines __init__ con super().__init__() y construyes la lógica en forward. Lo que cambia son los bloques de Lego que usas y cómo los conectas.

En el Hola Mundo conectabas piezas predefinidas; aquí defines tus propios parámetros con nn.Parameter y los combinas en una operación lineal volumen * x + sesgo. Mismo proceso, distinto nivel de control.

Si llegaste hasta aquí, ya tienes un modelo funcional listo para ser entrenado. Cuéntame en los comentarios qué semilla usaste y qué valores iniciales obtuviste para tus pesos.