Objetivo: seguir el cálculo de una red y distinguir entrenamiento e inferencia.
La propagación hacia adelante (forward pass) aplica cada capa en orden. Produce los logits y, después, la pérdida si los objetivos están disponibles. No modifica ningún peso.
logits = model(x) # propagación hacia adelante
loss = criterion(logits, y)Para un batch x de forma (32, 20), una capa Linear(20, 64) da (32, 64).
Una segunda Linear(64, 4) da (32, 4). El eje batch se conserva; el último eje
cambia según la capa.
En entrenamiento, la red conserva la información necesaria para el cálculo de los gradientes. En inferencia, se desactiva ese seguimiento y se coloca el modelo en modo evaluación:
model.eval()
with torch.inference_mode():
logits = model(x)
predictions = logits.argmax(dim=1)model.eval() ajusta el comportamiento de Dropout y BatchNorm. inference_mode() evita la
construcción del grafo de gradiente. Las dos operaciones son complementarias.
Una red es un grafo de operaciones. PyTorch memoriza qué operaciones produjeron
cada tensor cuando requires_grad=True. Esa traza será recorrida en sentido inverso por
la retropropagación.
argmax antes de la función de pérdida: la operación destruye la información útil para el
gradiente.model.eval() durante la validación.¿La propagación hacia adelante aprende? ¿Por qué llamar a la vez a eval() y a
inference_mode()?
No, calcula. eval() cambia ciertas capas; inference_mode() desactiva el
grafo de gradiente.
Escribe una pseudoprueba que llame dos veces al mismo modelo con dropout, primero en
modo entrenamiento y luego en modo evaluación. Predice qué resultados deben ser idénticos
y explica el papel distinto de eval() e inference_mode(). Entregable: prueba y diagnóstico.
Lectura: la propagación hacia adelante calcula las salidas en ambos casos, pero solo el recorrido
de entrenamiento conserva lo necesario para el cálculo de los gradientes. En inferencia,
combina model.eval() y torch.inference_mode(). La trampa es creer que uno
reemplaza al otro: controlan mecanismos diferentes.