optimizer.zero_grad()Muchos novatos en DL se rompen no con la arquitectura compleja de las redes, sino con el simple boilerplate de PyTorch. El orden de las llamadas en el bucle de entrenamiento es algo que tienes que buscar una y otra vez hasta que se grabe en tu subconsciente.
¿Olvidaste poner el modelo en modo
train()? Obtienes pesos incorrectos debido a Dropout/BatchNorm.¿Olvidaste
zero_grad()? Felicidades, los gradientes se acumulan, el entrenamiento va a la basura.¿Pusiste
step() antes de backward()? Bueno, ya sabes.Me topé con un video que provoca dos sentimientos a la vez: mucho cringe y respeto.
Un tipo en calzoncillos y con un micrófono en medio del desorden simplemente tomó y puso los 5 pasos de la retropropagación en una melodía que no puedes sacarte de la cabeza.
Como si funcionara mejor que 10 horas de aburridas conferencias de expertos que leen diapositivas.
Para los que están perdidos, les recuerdo el único orden correcto de acciones que deben tatuarse en el subconsciente (o aprender la canción):
1️⃣
model.train() — ponemos el modelo en modo de combate.2️⃣
y_pred = model(x) — Forward pass.3️⃣
loss = loss_fn(y_pred, y) — Calculamos cuánto nos equivocamos.4️⃣
optimizer.zero_grad() — Ponemos a cero los gradientes antes del nuevo paso, de lo contrario se acumularán y volarán al espacio.5️⃣
loss.backward() — Calculamos los gradientes (retropropagación).6️⃣
optimizer.step() — Damos un paso con el optimizador.También me gustaría una versión para TensorFlow, pero allí, me temo, habría que escribir una ópera en tres actos solo para inicializar las variables 🌚
#por_la_risa
Comentarios
0Aún no hay comentarios.
Inicia sesión para participar en la conversación.