How to Test a Model in PyTorch: Simple Guide with Example
To test a model in
PyTorch, set the model to evaluation mode using model.eval(), disable gradient calculation with torch.no_grad(), and run your test data through the model to get predictions. Then, compare predictions with true labels to compute metrics like accuracy.Syntax
Testing a PyTorch model involves three main steps:
- Set evaluation mode:
model.eval()disables training-specific layers like dropout. - Disable gradients: Use
with torch.no_grad():to save memory and computation. - Run inference: Pass test inputs to the model and collect outputs for metric calculation.
python
model.eval() with torch.no_grad(): outputs = model(inputs) # compute metrics here
Example
This example shows how to test a simple neural network on dummy test data and calculate accuracy.
python
import torch import torch.nn as nn # Define a simple model class SimpleModel(nn.Module): def __init__(self): super().__init__() self.linear = nn.Linear(10, 2) # 10 features, 2 classes def forward(self, x): return self.linear(x) # Create model and dummy test data model = SimpleModel() test_inputs = torch.randn(5, 10) # 5 samples, 10 features each test_labels = torch.tensor([0, 1, 1, 0, 1]) # true classes # Testing the model model.eval() # set to eval mode with torch.no_grad(): outputs = model(test_inputs) # get raw outputs predictions = torch.argmax(outputs, dim=1) # predicted classes # Calculate accuracy correct = (predictions == test_labels).sum().item() total = test_labels.size(0) accuracy = correct / total print(f"Accuracy: {accuracy:.2f}")
Output
Accuracy: 0.40
Common Pitfalls
Common mistakes when testing PyTorch models include:
- Not calling
model.eval(), which keeps dropout and batch norm layers in training mode and leads to inconsistent results. - Forgetting to disable gradients with
torch.no_grad(), causing unnecessary memory use and slower inference. - Mixing training and testing data or not properly comparing predictions to true labels.
python
import torch import torch.nn as nn model = nn.Linear(10, 2) inputs = torch.randn(3, 10) # Wrong way: no eval mode and gradients enabled outputs_train = model(inputs) # dropout active if present # Right way: model.eval() with torch.no_grad(): outputs_test = model(inputs)
Quick Reference
- model.eval(): Switch model to evaluation mode.
- torch.no_grad(): Disable gradient tracking during inference.
- torch.argmax(outputs, dim=1): Get predicted class indices.
- Compare predictions with labels to compute accuracy or other metrics.
Key Takeaways
Always call model.eval() before testing to disable training behaviors.
Use torch.no_grad() to save memory and speed up inference.
Compare model predictions with true labels to measure accuracy.
Avoid mixing training and testing steps to get reliable results.