A training loop helps a model learn from data by repeating steps many times. It updates the model to make better predictions.
When you want to teach a model to recognize images.
When you need to improve a model's predictions on new data.
When training a model to understand text or speech.
When adjusting model weights to reduce errors.
When running experiments to compare different models.
Syntax
PyTorch
for epoch inrange(num_epochs):
for inputs, labels in dataloader:
optimizer.zero_grad()
outputs = model(inputs)
loss = loss_function(outputs, labels)
loss.backward()
optimizer.step()
The outer loop runs over epochs (full passes over data).
The inner loop runs over batches of data for efficiency.
Examples
Basic training loop running 5 epochs over batches from train_loader.
PyTorch
for epoch inrange(5):
for inputs, labels in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
Training loop with loss tracking and printing average loss per epoch.
PyTorch
for epoch inrange(3):
total_loss = 0for inputs, labels in train_loader:
optimizer.zero_grad()
outputs = model(inputs)
loss = criterion(outputs, labels)
loss.backward()
optimizer.step()
total_loss += loss.item()
print(f"Epoch {epoch+1}, Loss: {total_loss/len(train_loader):.4f}")
Sample Model
This program trains a simple linear model on random data for 3 epochs. It prints the average loss after each epoch to show learning progress.
PyTorch
import torch
import torch.nn as nn
import torch.optim as optim
from torch.utils.data import DataLoader, TensorDataset
# Simple dataset: inputs and labels
inputs = torch.randn(100, 3)
labels = torch.randn(100, 1)
dataset = TensorDataset(inputs, labels)
train_loader = DataLoader(dataset, batch_size=10)
# Simple model: one linear layer
model = nn.Linear(3, 1)
# Loss function and optimizer
criterion = nn.MSELoss()
optimizer = optim.SGD(model.parameters(), lr=0.1)
num_epochs = 3for epoch inrange(num_epochs):
total_loss = 0for batch_inputs, batch_labels in train_loader:
optimizer.zero_grad()
outputs = model(batch_inputs)
loss = criterion(outputs, batch_labels)
loss.backward()
optimizer.step()
total_loss += loss.item()
avg_loss = total_loss / len(train_loader)
print(f"Epoch {epoch+1}, Loss: {avg_loss:.4f}")
OutputSuccess
Important Notes
Always call optimizer.zero_grad() before loss.backward() to reset gradients.
Use batches to speed up training and use less memory.
Printing loss helps see if the model is learning or stuck.
Summary
A training loop repeats over data to improve the model.
Hint: Multiply epochs by batches for total prints [OK]
Common Mistakes:
Confusing range end values
Mixing epoch and batch indices
Counting fewer batches than loop runs
4. Identify the error in this PyTorch training loop snippet:
for data, target in dataloader:
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward
optimizer.step()
medium
A. Missing parentheses after loss.backward
B. optimizer.zero_grad() should be after optimizer.step()
C. criterion should be called before model(data)
D. optimizer.step() should be called before loss.backward
Solution
Step 1: Check method calls
loss.backward is missing parentheses, so it is not called as a function.
Step 2: Verify correct order
optimizer.zero_grad() is correctly before backward and step; criterion call order is correct; optimizer.step() after backward is correct.
Final Answer:
Missing parentheses after loss.backward -> Option A
Quick Check:
Call loss.backward() with parentheses [OK]
Hint: Always add () to call backward() [OK]
Common Mistakes:
Forgetting parentheses on backward()
Changing correct optimizer.zero_grad() position
Misordering loss and model calls
5. You want to train a model for 5 epochs with batches of size 10. Which of the following training loop structures correctly implements this in PyTorch?
hard
A. for epoch in range(5):
optimizer.zero_grad()
for batch_idx, (data, target) in enumerate(dataloader):
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
B. for batch_idx, (data, target) in enumerate(dataloader):
for epoch in range(5):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
C. for epoch in range(5):
for batch_idx, (data, target) in enumerate(dataloader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
D. for epoch in range(5):
for batch_idx, (data, target) in enumerate(dataloader):
output = model(data)
loss = criterion(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step()
Solution
Step 1: Check loop order
The outer loop should be epochs, inner loop batches. for epoch in range(5):
for batch_idx, (data, target) in enumerate(dataloader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step() follows this correctly.
Step 2: Verify zero_grad and step calls
optimizer.zero_grad() must be before backward(), and optimizer.step() after. for epoch in range(5):
for batch_idx, (data, target) in enumerate(dataloader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step() has correct order.
Step 3: Check other options
for batch_idx, (data, target) in enumerate(dataloader):
for epoch in range(5):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step() reverses loops (wrong). for epoch in range(5):
optimizer.zero_grad()
for batch_idx, (data, target) in enumerate(dataloader):
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step() zeros gradients outside batch loop (wrong). for epoch in range(5):
for batch_idx, (data, target) in enumerate(dataloader):
output = model(data)
loss = criterion(output, target)
optimizer.zero_grad()
loss.backward()
optimizer.step() zeros gradients after forward pass (wrong order).
Final Answer:
for epoch in range(5):
for batch_idx, (data, target) in enumerate(dataloader):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step() -> Option C
Quick Check:
Epochs outside, zero_grad before backward, step after [OK]
Hint: Epoch loop outside, zero_grad before backward [OK]
Common Mistakes:
Swapping epoch and batch loops
Calling zero_grad outside batch loop
Calling zero_grad after forward pass
Recommended
Ready to prove it?
Pass the test and this pattern moves unknownstrongwhile earning +1 Grip toward your certificate.